创建操作以从字符串提供的 属性 的名称分配 属性
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();
}
我想要实现的是创建 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();
}