创建操作以从字符串提供的 属性 的名称分配 属性

Create Action to assign property from name of a property provided by string

我想要实现的是创建 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 期间而不是在创建它时传递 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();
}