从动态属性中获取值

时间:2012-02-09 04:49:48

标签: c# .net

我正在开发一个广泛使用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 个答案:

答案 0 :(得分:1)

您可以使用Reflection以这种方式获取属性值:

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

答案 1 :(得分:1)

如果您使用.net framework 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("");
           }    
       } 
   }