让自定义类的成员读取他们的值

Posted

技术标签:

【中文标题】让自定义类的成员读取他们的值【英文标题】:Get members of custom class to read their values 【发布时间】:2017-04-27 08:56:52 【问题描述】:

假设我有课:

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);
    

【讨论】:

谢谢。因此,如果我理解正确,“MemberInfo”是“PropertyInfo”和“FieldInfo”的基础。我看不到 'GetValue()' 因为 'MemberInfo' 没有指向它,所以我需要将它转换为 f.e. 'FieldInfo' 以查看 'GetValue()' 方法。 是的,MemberInfo 是 PropertyInfo 和 FieldInfo 的基类。但它不会公开 GetValue(),因为属性和字段的实现和签名是不同的。【参考方案2】:

TC.GetType().GetProperty(propName).GetValue(TC);

【讨论】:

【参考方案3】:

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

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));
    

【讨论】:

以上是关于让自定义类的成员读取他们的值的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio基础项目-两个Activity的Intent传值自定义类数据(如数据库数据读取)。

Android Studio基础项目-两个Activity的Intent传值自定义类数据(如数据库数据读取)。

Android Studio基础项目-两个Activity的Intent传值自定义类数据(如数据库数据读取)。

ASP+ACCESS里怎样按某条字段值自定义排序?

java中类继承,到底继承了什么?

请问啥是成员函数的定义?