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

问题描述 投票:0回答:1

我想要实现的是创建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属性添加另一个参数。

c# expression-trees
1个回答
2
投票

你在那儿很忙。只需为您的新参数声明另一个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();
}

© www.soinside.com 2019 - 2024. All rights reserved.