2012-02-09 101 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