Ich entschuldige mich, wenn das irgendwo abgedeckt ist. Ich habe vor dem Posten recherchiert!Wie bekomme ich Felder und Eigenschaften im Einzelaufruf über Reflektion?
OK, also Frage ... Ich benutze GetType() .GetProperties, aber es gibt keine einfachen Instanzfelder, die nicht get/set auf ihnen haben ... so habe ich .GetFields verwendet, das findet sie, aber ich möchte ein einfaches einzelnes Objekt bekommen, um einen Wert zu erhalten/setzen, ohne zwischen Feldern und Eigenschaften zu wechseln ... ist das möglich?
mein aktueller Code funktioniert auf PropertyInfo, das funktioniert gut, aber das ist nicht für Felder, denke ich?
[bearbeiten] Dies ist die Lösung, die ich kam, die gut funktioniert. Dank jeder ....
// 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");
}
}
Von OP: "Erhalten Sie ein einfaches einzelnes Objekt, um einen Wert zu erhalten/setzen". Ich bin mir nicht sicher, wie MemberInfo das macht. – CrazyCasta
@CrazyCasta tatsächlich; Wenn Sie das wollen, müssen Sie die Core-Reflection-API verlassen, da es keine einzige gemeinsame Schnittstelle dafür gibt. Es existieren jedoch separate Bibliotheken, weshalb ich FastMember zitierte. –
Ich möchte sowohl @CrazyCasta als auch marc als Antworten markieren, da sie beide hilfreich sind, aber letztendlich habe ich mit der MemberInfo die Erweiterungsmethoden verwendet. – Timmerz