我正在使用表达式树创建一个通用的setter,这是我的代码:
我这样调用该方法。
public Expression<Action<T,string>> GetAction<T>(string fieldName)
{
ParameterExpression targetExpr = Expression.Parameter(typeof(T), "Target");
MemberExpression fieldExpr = Expression.Property(targetExpr, fieldName);
ParameterExpression valueExpr = Expression.Parameter(fieldExpr.Type, "value");
UnaryExpression valueCast = (!fieldExpr.Type.IsValueType)
? Expression.TypeAs(valueExpr, fieldExpr.Type)
: Expression.Convert(valueExpr, fieldExpr.Type);
BinaryExpression assignExpr = Expression.Assign(fieldExpr, valueCast);
return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);
}
我在上述方法中没有调用.Compile()
,因为我想查看它构建的表达式。
我的目的是
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
我这样调用该方法。
var lastname = GetAction<Person>("FirstName");
var age = GetAction<Person>("Age");
lastname.Compile()(p, "Solutions");
age.Compile()(p, "10");
我之所以将年龄作为字符串传递,是因为我将从XML中获取此值。
它可以创建FirstName
的Action而不会出现任何错误,但是对于Age
则会出错。
错误发生在这行代码中Age
:
return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);
错误:
类型为'System.Int32'的ParameterExpression不能用于类型为'System.String'的委托参数
我能通过dynamic做些什么..?
我希望有人能提供一些解决方案。谢谢