私はここで式ツリーを用いた一般的なセッターを作成してるのデリゲートパラメータのために使用することはできませんが、私のコード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()
と呼びます。なぜなら、それが構築する式を調べたいからです。
そして、私のオブジェクトは、私が文字列として年齢を渡す理由は、私はXMLからこの値を取得します。この
var lastname = GetAction<Person>("FirstName");
var age = GetAction<Person>("Age");
lastname.Compile()(p, "Solutions");
age.Compile()(p, "10");
のようなメソッドを呼び出す
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
です。
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に年齢をキャストではないでしょうか? –