I have a method accepting an array of Expression<Func<T, object>>
- the idea being that by downcasting the property type to object
that I can represent every property access in the same way. The actual use case is to ignore particular properties when mapping classes using reflection.
Intended to be used like so:
someObject.Map(exclude: x => x.Value, y => y.SomeOtherPropertyWeDontCareAbout);
The expressions I am getting have a Body
NodeType
of Convert
- because they are getting downcast to a return type of object
when I create them.
However, now I want to use these expressions to access actual properties on a given instance of T
. When I try to do this it looks like I need to convert my expression back to a member access expression. However, casting to a MemberAccessExpression
returns null
.
If I try to just invoke the expression by calling Compile()
and then invoking it, I get null
. Code below. How do I convert back to a proper property access so that I can use it to access properties on an instance of T
?
class Program
{
static void Main(string[] args)
{
var obj = new Test
{
Value = "HELLO!"
};
var getter = new PropertyMapper().GetMemberAccess<Test>( "Value" );
object result = getter.Compile()( obj ); //this is null and not 'HELLO!!'
}
}
public class Test
{
public string Value { get; set; }
}
public class PropertyMapper
{
public Expression<Func<T, object>> GetMemberAccess<T>(string propertyName)
{
var propInfo = typeof(T).GetProperty( propertyName );
return GetGetterExpression<T>( propInfo );
}
private Expression<Func<T, object>> GetGetterExpression<T>(PropertyInfo propInfo)
{
var param = Expression.Parameter(typeof(T), "e");
Expression propExpression = Expression.Property(param, propInfo);
if (propInfo.PropertyType != typeof(object))
propExpression = Expression.Convert(propExpression, typeof(object));
return Expression.Lambda<Func<T, object>>(propExpression, param);
}
}
Aucun commentaire:
Enregistrer un commentaire