我使用表達式樹創建一個一般的setter和這裏的委託參數是我的代碼ParameterExpression不能被用於類型「System.String」
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
的行動沒有任何錯誤,而對於Age
它吹。
錯誤發生在這一行Age
:
return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);
錯誤:
ParameterExpression of type 'System.Int32' cannot be used for delegate parameter of type 'System.String'
我可以做動態的東西..?
我希望有人會有一些解決方案。由於
你爲什麼不只是將它傳遞給操作之前投的年齡爲int? – 2012-03-29 14:40:51