Given:
FieldInfo field = ;
ParameterExpression targetExp = Expression.Parameter(typeof(T), \"target\");
ParameterExp
I once made this class. Perhaps it helps:
public class GetterSetter
{
private readonly Func getter;
private readonly Action setter;
private readonly string propertyName;
private readonly Expression> propertyNameExpression;
public EntityType Entity { get; set; }
public GetterSetter(EntityType entity, Expression> property_NameExpression)
{
Entity = entity;
propertyName = GetPropertyName(property_NameExpression);
propertyNameExpression = property_NameExpression;
//Create Getter
getter = propertyNameExpression.Compile();
// Create Setter()
MethodInfo method = typeof (EntityType).GetProperty(propertyName).GetSetMethod();
setter = (Action)
Delegate.CreateDelegate(typeof(Action), method);
}
public propType Value
{
get
{
return getter(Entity);
}
set
{
setter(Entity, value);
}
}
protected string GetPropertyName(LambdaExpression _propertyNameExpression)
{
var lambda = _propertyNameExpression as LambdaExpression;
MemberExpression memberExpression;
if (lambda.Body is UnaryExpression)
{
var unaryExpression = lambda.Body as UnaryExpression;
memberExpression = unaryExpression.Operand as MemberExpression;
}
else
{
memberExpression = lambda.Body as MemberExpression;
}
var propertyInfo = memberExpression.Member as PropertyInfo;
return propertyInfo.Name;
}
test:
var gs = new GetterSetter(new OnOffElement(), item => item.IsOn);
gs.Value = true;
var result = gs.Value;