Создать действие для назначения свойства из имени свойства, предоставленного строкой - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь создать 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; }
}

Но я бы хотел передать параметр DateTime во время вызова Action, а не во время его создания. И, возможно, добавить еще один параметр для свойства EndTime.

1 Ответ

2 голосов
/ 13 января 2020

Вы прошли большую часть пути туда. Просто объявите еще один 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();
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...