2011-03-01 5 views
3

어떻게 객체의 속성을 반복하고 속성의 값을 얻을 수 있습니까?
나는 데이터로 채워지는 몇 가지 속성을 가진 객체를 가지고있다. 사용자는 속성의 이름을 제공하여 보려는 속성을 지정하고 객체의 속성을 검색하여 그 값을 사용자에게 반환해야합니다.
어떻게해야합니까?
내가 속성을 얻기 위해 다음과 같은 코드를 작성하지만 소품의 값을 가져올 수 없습니다 :객체를 통한 루핑

public object FindObject(object OBJ, string PropName) 
    { 
     PropertyInfo[] pi = OBJ.GetType().GetProperties(); 
     for (int i = 0; i < pi.Length; i++) 
     { 
      if (pi[i].PropertyType.Name.Contains(PropName)) 
       return pi[i];//pi[i] is the property the user is searching for, 
          // how can i get its value? 
     } 
     return new object(); 
    } 
+0

중복 가능성 (http://stackoverflow.com/questions/957783/loop-through-an-objects [통해서와 루프 C#의 등록 개체] -properties-in-c) – Gabe

+0

가능한 복제본 http://stackoverflow.com/q/2737663/310574 또한 – Gabe

답변

8

이 (코드 삽입 인라인) 시도 :

public object FindObject(object OBJ, string PropName) 
{ 
    PropertyInfo[] pi = OBJ.GetType().GetProperties(); 
    for (int i = 0; i < pi.Length; i++) 
    { 
     if (pi[i].PropertyType.Name.Contains(PropName)) 
     { 
      if (pi[i].CanRead)      //Check that you can read it first 
       return pi[i].GetValue(OBJ, null); //Get the value of the property 
     } 
    } 
    return new object(); 
} 
6

PropertyInfo에서 값을 얻으려면을, 당신은 전화 GetValue : 나는 당신 정말이 원하는 것을 의심 재산의 이름을 얻으려면 유형 마음. 나는 당신이 원하는 의심 : 당신은 아마 속성이 인덱서하지 않고, 읽기 등 LINQ는 필터링 가지의 좋은 방법입니다, 아니면 그냥 Type.GetProperty를 사용할 수에 액세스 할 수 있는지 확인해야합니다

if (pi[i].Name == PropName) 
{ 
    return pi[i].GetValue(OBJ, null); 
} 

주 루핑 대신 필요한 이름을 가진 속성에 곧바로 도달하려면 - 다음 필요한 모든 유효성 검사를 수행하십시오.

또한 명명 규칙을 따르고 foreach 루프를 사용해야합니다. 아, 그리고 아마도 null을 반환하거나 속성을 찾을 수없는 경우 예외를 throw합니다. 나는 새로운 빈 객체를 반환하는 것이 좋은 생각인지 어떻게 볼 수 없다.

2

pi[i].GetValue(OBJ,null);은 사용할 함수입니다.

1
public static object FindObject(object obj, string propName) 
{ 
    return obj.GetType().GetProperties() 
     .Where(pi => pi.Name == propName && pi.CanRead) 
     .Select(pi => pi.GetValue(obj, null)) 
     .FirstOrDefault(); 
} 
0

PropertyInfo.GetValue 메서드를 호출하여 값을 가져옵니다.

public object FindObject(object OBJ, string PropName)  
{   
    PropertyInfo[] pi = OBJ.GetType().GetProperties();   

    for (int i = 0; i < pi.Length; i++)   
    {    
     if (pi[i].Name == PropName)     
     { 
      return pi[i].GetValue(OBJ, null); 
     } 
    }    

    return new object();  
} 

PropertyInfo를 포함한 모든 반사 유형이 클래스에 바인딩됩니다. 인스턴스 관련 데이터를 가져 오려면 클래스의 인스턴스를 전달해야합니다.