Ich bin eine allgemeine Setter mit Ausdrucksbaum zu schaffen und hier ist mein CodeParameterexpression des Typs ‚System.Int32‘ kann nicht für die Delegierten Parameter des Typs verwendet werden ‚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);
}
ich nicht Rufen Sie in der obigen Methode .Compile()
auf, weil ich den Ausdruck untersuchen möchte, den es erstellt.
Und mein Ziel ist
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
ich die Methode wie diese i das Alter passieren
var lastname = GetAction<Person>("FirstName");
var age = GetAction<Person>("Age");
lastname.Compile()(p, "Solutions");
age.Compile()(p, "10");
Der Grund
nennen als String ist, wird i von XML diesen Wert zu bekommen.Es erstellt Aktion für FirstName
ohne Fehler, während für Age
es bläst.
Fehler passiert in dieser Zeile für Age
:
return Expression.Lambda<Action<T, string>>(assignExpr, targetExpr, valueExpr);
Fehler:
ParameterExpression of type 'System.Int32' cannot be used for delegate parameter of type 'System.String'
Kann ich etwas tun, mit dynamischer ..?
Ich hoffe, jemand wird eine Lösung haben. Dank
Warum würden Sie nicht nur das Alter in einen int geworfen, bevor er auf die Aktion vorbei? –