【问题标题】:Get Values from Dynamic Property从动态属性中获取值
【发布时间】:2012-02-09 14:01:51
【问题描述】:

我正在开展一个广泛使用 XML 配置文件的项目,我想通过共享代码的通用实现将一些事情提升到一个新的水平。

问题是,在我的五个班级中,有两个以不同的方式处理“描述”网格视图。 此网格视图显示具有各种列的适当类型的对象。

还要注意:数据是通过数据记录传递的,因此 GUI 无法直接访问源对象。

这是我目前获取动态数据的“尝试”,使用了一种相当愚蠢的 hack(没用)

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(""); }
    }
}

必须有办法做到这一点,但我不确定它会被称为什么,或者如何解决这个问题。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    您可以通过这种方式使用反射来获取属性值:

    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

    【讨论】:

    • 完美!像魅力一样工作:)
    【解决方案2】:

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

    【讨论】:

    • 这似乎不起作用...编译器认为 '.propertyName' 是一个编译时值。值得注意的是,使用 '."foo" ' 也不起作用。
    猜你喜欢
    • 2010-12-13
    • 2013-01-04
    • 1970-01-01
    • 2020-02-13
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    相关资源
    最近更新 更多