I apologize if this is covered somewhere. I did research before posting!
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?
my current code works on PropertyInfo, which is working great, but that isn't for fields I guess?
[edit]
this is the solution I came up with, which is working good. thanks everyone….
// 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");
}
}
Best Answer
How about:
Alternatively, libraries like FastMember will work happily with either fields or properties, with get/set identical regardless of the member-type.