Ich habe eine Expression<Func<IMyclass, int>>
, die ich in einen Setter wie Expression<Action<object, object>>
typisiert konvertieren möchte. Wie kann das erreicht werden? Das Problem ist der object
Parameter. Mit dem richtigen Typ (string
) wäre das einfach.Create Setter Ausdruck <Action <Objekt, Objekt >> aus Ausdruck <Func <IM-Klasse, Int >>
class Foo
{
public Bar Bar { get; set; }
}
class Bar
{
public string Baz { get; set; }
}
static void Main(string[] args)
{
var expr = GetExpression(t => t.Bar.Baz);
var member = expr.Body as MemberExpression;
var p = Expression.Parameter(typeof(object), "p");
// This does not work...
var assign = Expression.Assign(member, p);
var lambda = Expression.Lambda<Action<object, object>>(assign, p);
object o = new Foo();
object v = "test";
lambda.Compile().Invoke(o, v);
}
private static Expression<Func<Foo, string>> GetExpression(Expression<Func<Foo, string>> expr)
{
return expr;
}
Schön! Kann dies ohne ExpressionVisitor gemacht werden? Oder wäre das komplizierter? – l33t
Ja, das wird viel komplizierter, weil du den gleichen Besucher machen musst, der bereits für dich tut, aber du selbst. Ausdrucksbäume sind unveränderlich, Sie können also nicht einfach einige Teile davon ändern - Sie müssen einen neuen Baum erstellen. – Evk
Ich denke, Sie sollten in der Lage sein, Ihren Besucher zu vereinfachen: Wechseln Sie zu 'Expression.Convert' in' VisitParameter' und entfernen Sie 'VisitMember'. – svick