2012-02-09 100 views
3

我正在研究一個廣泛使用XML配置文件的項目,並且我想借助共享代碼的一般實現將一些事情提升到新的水平。從動態屬性獲取值

問題是,在我的五個類中,兩個處理「描述」網格視圖的方式不同。 此網格視圖顯示具有各種列的適當類型的對象。

另外值得注意的是:數據是通過數據記錄傳遞的,因此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

完美,你也可以使用動態類型!工作像一個魅力:) – 2012-02-10 01:23:27

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」'也不起作用。 – 2012-02-10 01:20:47