2017-04-27 48 views
2

让说我有类:获取自定义类的成员读取它们的值

public class TestClass 
{ 
    public string Prop1 { get; set; } 
    public int Field1 = 1234567890; 
    public string Method1() { return "ABCDEFGHIJKLMNOPQRSTUVXYZ"; } 
} 

...类的实例和列表:

TestClass TC = new TestClass();  
List<object> TCValues = new List<object>(); 

...并填充与值列表循环:

 foreach (var v in TC.GetType().GetProperties()) // or .GetFields() 
     { 
      TCValues.Add(v.GetValue(TC, null));     
     } 

...问题是,在我的具体情况我需要首先获得所有类成员的名单,然后将其过滤属性和域(忽略过程的方法),然后当我在第一个例子读它们的值:

 foreach (var v in TC.GetType().GetMembers()) 
     { 
      if (v.MemberType == System.Reflection.MemberTypes.Property || v.MemberType == System.Reflection.MemberTypes.Field) 
      { 
       TCValues.Add(v.?????????); // Can't get values ! 
      } 
     } 

...我明白GetMembers()收益类MemberInfo它不像PropertyInfoFieldInfo不含方法GetValue()。有没有什么方法可以通过循环访问MemberInfo集合来读取循环内的过滤属性和字段成员的值?

回答

1

在你的foreach循环尝试

foreach (var v in TC.GetType().GetMembers()) 
{ 
    if (v is PropertyInfo) 
    { 
     var value = ((PropertyInfo)v).GetValue(TC, null); 
     TCValues.Add(value); 
    } 
    else if (v is FieldInfo) 
    { 
     var value = ((FieldInfo) v).GetValue(TC); 
     TCValues.Add(value); 
    } 
} 
+0

感谢。所以如果我理解得当,'MemberInfo'是'PropertyInfo'和'FieldInfo'的基础。我看不到'GetValue()',因为'MemberInfo'没有指向它,所以我需要将它转换为f.e. 'FieldInfo'来查看'GetValue()'方法。 – cembo

+0

是的,MemberInfo是PropertyInfo和FieldInfo的基类。但它不公开GetValue(),因为实现和签名对于属性和字段是不同的。 – MiGro

-1

你必须成员转换为正确的类型:

foreach (var v in TC.GetType().GetMembers()) 
{ 
    if (v.MemberType == System.Reflection.MemberTypes.Property) 
    { 
     TCValues.Add(((System.Reflection.PropertyInfo)v).GetValue(TC,null)); 
    } 
    else if (v.MemberType == System.Reflection.MemberTypes.Field) 
    { 
     TCValues.Add(((System.Reflection.FieldInfo)v).GetValue(TC)); 
    } 
}