我想要实现的是创建Action来为字符串定义的对象属性分配值。到目前为止,我想出的是:
void Main()
{
var startPropertyName= "StartTime";
var endPropertyName= "EndTime";
var myAction = AssignValueToProperty<MyClass>(startPropertyName, DateTime.Today);
var myObject = new MyClass();
myAction(myObject);
myObject.StartTime.Dump();
}
public static Action<T> AssignValueToProperty<T>(string propertyName, DateTime value)
{
var arg = Expression.Parameter(typeof(T));
var property = Expression.Property(arg, propertyName);
var cons = Expression.Constant(value, typeof(DateTime));
var body = Expression.Assign(property, cons);
var exp = Expression.Lambda<Action<T>>(body, new ParameterExpression[] { arg });
return exp.Compile();
}
public class MyClass
{
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
但是我想在调用Action而不是在创建Action时传递DateTime参数。并可能为EndTime属性添加另一个参数。
你在那儿很忙。只需为您的新参数声明另一个ParameterExpression
。
public static Action<T, DateTime> AssignValueToProperty<T>(string propertyName)
{
var arg = Expression.Parameter(typeof(T), "arg");
var startTime = Expression.Parameter(typeof(DateTime), "startTime");
var property = Expression.Property(arg, propertyName);
var body = Expression.Assign(property, startTime);
var exp = Expression.Lambda<Action<T, DateTime>>(body, new ParameterExpression[] { arg, startTime });
return exp.Compile();
}