让自定义类的成员读取他们的值
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
,这与PropertyInfo
和FieldInfo
不包含方法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传值自定义类数据(如数据库数据读取)。