Przepraszam, jeśli jest to gdzieś ukryte. Zrobiłem badania przed opublikowaniem!jak uzyskać oba pola i właściwości w jednym wywołaniu za pomocą odbicia?
ok, więc pytanie ... Używam GetType() .GetProperties, ale nie zwraca pól proste instancji, które nie mają get/set na nich ... więc użyłem .GetFields, który je znajduje, ale chcę uzyskać prosty pojedynczy obiekt, aby uzyskać/ustawić wartość bez odwracania między polami i właściwościami ... czy to możliwe?
mój obecny kod działa na PropertyInfo, który działa świetnie, ale to nie jest dla pól, które myślę?
[edycja] to jest rozwiązanie, które wymyśliłem, które działa dobrze. Dzięki wszystkim ....
// 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");
}
}
Z OP: "uzyskaj prosty pojedynczy obiekt, aby uzyskać/ustawić wartość". Nie jestem pewien jak to robi MemberInfo. – CrazyCasta
@CrazyCasta w rzeczy samej; jeśli chcesz, musisz wyjść poza rdzeń interfejsu API, ponieważ tam * nie ma * jednego wspólnego interfejsu. Jednak istnieją oddzielne biblioteki, dlatego zacytowałem FastMember. –
Naprawdę chciałbym zaznaczyć zarówno @CrazyCasta i marc jako odpowiedzi, ponieważ są one pomocne, ale ostatecznie poszedłem z MemberInfo przy użyciu metod rozszerzenia. – Timmerz