如果覆蓋某處,我很抱歉。我在發佈前做過調查!如何通過反射在單個調用中獲取字段和屬性?
好吧,所以問題...我使用GetType().GetProperties,但它沒有返回簡單的實例字段,它們沒有get/set對他們...所以我用.GetFields,找到它們,但我想獲得一個簡單的單個對象來獲取/設置一個值,而不需要在字段和屬性之間進行翻轉......這可能嗎?
我目前的代碼在PropertyInfo上工作,這是工作很好,但這不是我猜的字段?
這是我想出的解決方案,這是行之有效的。感謝大家....
// 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");
}
}
從OP:「得到一個簡單的單一對象來獲取/設置值」。我不確定MemberInfo是如何做到這一點的。 – CrazyCasta
@CrazyCasta確實;如果你想,你需要爲有核心的反射API外臺階*爲*的,沒有一個單一的共享接口。然而,單獨的庫確實存在,這就是我引用FastMember的原因。 –
我真的想都@CrazyCasta和Marc標記爲答案,因爲他們都是有幫助的,但最終我沒有用的MemberInfo使用擴展方法去。 – Timmerz