Me disculpo si esto está cubierto en alguna parte. Investigué antes de publicar!cómo obtener campos y propiedades en una sola llamada mediante la reflexión?
bien, entonces pregunta ... Estoy usando GetType() .GetProperties, pero no devuelve campos de instancia simples, que no tienen get/set en ellos ... así que usé .GetFields, que los encuentra, pero quiero obtener un único objeto simple para obtener/establecer un valor sin voltear entre campos y propiedades ... ¿es esto posible?
mi código actual funciona en PropertyInfo, que funciona muy bien, pero eso no es para campos, supongo?
[editar] esta es la solución que se me ocurrió, que funciona bien. gracias a todos ....
// 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");
}
}
Desde OP: "obtener un objeto simple simple para obtener/establecer un valor". No estoy seguro de cómo MemberInfo hace eso. – CrazyCasta
@CrazyCasta de hecho; si lo desea, debe salir de la API de reflexión central ya que * no hay * interfaz compartida única para eso. Sin embargo, existen bibliotecas separadas, por lo que cité FastMember. –
Realmente me gustaría marcar tanto @CrazyCasta como orc como respuestas, ya que son útiles, pero al final fui con el MemberInfo utilizando métodos de extensión. – Timmerz