如何通过反射在单个调用中同时获取字段和属性? [英] how to get both fields and properties in single call via reflection?
问题描述
如果这在某处被覆盖,我深表歉意.发帖前我做了研究!
I apologize if this is covered somewhere. I did research before posting!
好的,那么问题...我使用的是 GetType().GetProperties,但它没有返回简单的实例字段,这些字段没有 get/set...所以我使用了 .GetFields,它找到了它们,但我想获得一个简单的单个对象来获取/设置一个值,而无需在字段和属性之间翻转......这可能吗?
okay, so question...I'm using GetType( ).GetProperties, but it isn't returning simple instance fields, which don't have get/set on them...so I used .GetFields, which finds them, but I want to get a simple single object to get/set a value on without flipping between fields and properties...is this possible?
我当前的代码适用于 PropertyInfo,效果很好,但我猜这不适用于字段?
my current code works on PropertyInfo, which is working great, but that isn't for fields I guess?
这是我想出的解决方案,效果很好.谢谢大家....
// some logic borrowed from James Newton-King, http://www.newtonsoft.com
public static void SetValue(this MemberInfo member, object property, object value)
{
if (member.MemberType == MemberTypes.Property)
((PropertyInfo)member).SetValue(property, value, null);
else if (member.MemberType == MemberTypes.Field)
((FieldInfo)member).SetValue(property, value);
else
throw new Exception("Property must be of type FieldInfo or PropertyInfo");
}
public static object GetValue(this MemberInfo member, object property)
{
if (member.MemberType == MemberTypes.Property)
return ((PropertyInfo)member).GetValue(property, null);
else if (member.MemberType == MemberTypes.Field)
return ((FieldInfo)member).GetValue(property);
else
throw new Exception("Property must be of type FieldInfo or PropertyInfo");
}
public static Type GetType(this MemberInfo member)
{
switch (member.MemberType)
{
case MemberTypes.Field:
return ((FieldInfo)member).FieldType;
case MemberTypes.Property:
return ((PropertyInfo)member).PropertyType;
case MemberTypes.Event:
return ((EventInfo)member).EventHandlerType;
default:
throw new ArgumentException("MemberInfo must be if type FieldInfo, PropertyInfo or EventInfo", "member");
}
}
推荐答案
怎么样:
const BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;
MemberInfo[] members = type.GetFields(bindingFlags).Cast<MemberInfo>()
.Concat(type.GetProperties(bindingFlags)).ToArray();
或者,像 FastMember 这样的库可以很好地处理字段或属性,无论成员类型如何,get/set 都是相同的.
Alternatively, libraries like FastMember will work happily with either fields or properties, with get/set identical regardless of the member-type.
这篇关于如何通过反射在单个调用中同时获取字段和属性?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!