2012-02-09 4 views
3

XML 구성 파일을 광범위하게 사용하는 프로젝트에서 작업 중이며 공유 코드의 일반적인 구현을 통해 다음 단계로 넘어 가고 싶습니다.동적 속성에서 값 가져 오기

문제는 5 개의 클래스 중 2 개가 "설명"격자보기를 다르게 처리합니다. 이 격자보기는 다양한 유형의 적절한 유형의 객체를 보여줍니다.

참고 : 데이터는 데이터 레코드를 통해 전달되므로 GUI는 원본 개체에 직접 액세스 할 수 없습니다. 여기

은 (작동하지 않았다) 오히려 바보 해킹을 사용하여 동적 데이터를 얻을 수 내 현재의 "시도"이다

GetObjectData(MyClass myObject, string[] dataToGet) 
{ 
    List<string> dataToReturn = new List<string>(); 
    foreach (string propertyName in dataToGet) 
    { 
     try 
     { 
     Label tempLabel = new Label(); 
     tempLabel.DataBindings.Add("Text", myObject, propertyName); 

     dataToReturn.Add(tempLabel.Text); 
     } 
     catch { dataToReturn.Add(""); } 
    } 
} 

가 할 수있는 방법이 될,하지만 난 모르겠어요해야 할 일 또는 문제에 접근하는 방법을 알려줄 것입니다.

답변

2

이 방식으로 속성 값을 얻기 위해 반사를 사용할 수 있습니다

public void GetObjectData(MyClass myObject, string[] dataToGet) 
     {  
      List<string> dataToReturn = new List<string>(); 

      Type type = myObject.GetType(); 

      foreach (string propertyName in dataToGet)  
      {   
       try   
       { 
        PropertyInfo pInfo = type.GetProperty(propertyName); 
        var myValue = pInfo.GetValue(myObject, null); 
        dataToReturn.Add(Convert.ToString(myValue));   
       }  
       catch 
       { dataToReturn.Add(""); 
       }  
      } 
     } 

희망 당신은 ... 당신이 dictionay를 사용할 수있는이 도움이 문자열의 수익보다는 목록을 저장합니다. 참조를 들어

:
Use reflection to get the value of a property by name in a class instance
Set property Nullable<> by reflection
Reflection - get attribute name and value on property

MSDN

+0

완벽한를 사용하는 경우 당신은 또한 동적 유형을 사용할 수 있습니다! 매력처럼 작동합니다 :) –

1

는 .NET 프레임 워크 4

public void GetObjectData(dynamic myObject, string[] dataToGet) 
    {  
     List<string> dataToReturn = new List<string>(); 

     foreach (string propertyName in dataToGet)  
     {   
      try   
      { 
       dataToReturn.Add(Convert.ToString(myObject.propertyName));   
      }  
      catch 
      { dataToReturn.Add(""); 
      }  
     } 
    } 
+0

이것은 작동하지 않습니다 ... 컴파일러는 '.propertyName'은 컴파일 타임 값이라고 생각합니다. 특히, '. "foo"'를 사용하면 작동하지 않습니다. –