1
Ich habe den folgenden Code:Wie den von Expression.Call() zurückgegebenen Wert einem ParameterExpression zuweisen?
var factory = Expression.Parameter(typeof(FooFactory));
var fooInstance = Expression.Variable(typeof(Foo));
var factoryCall = Expression.Call(factory, "Instantiate", new[] { typeof(Foo) });
Expression.Assign(fooInstance, factoryCall);
List<Expression> expressions = new List<Expression>();
// TODO : add more expressions to do things on fooInstance ...//
expressions.Add(fooInstance); //return fooInstance
Expression finalExpr = Expression.Block(new[] { fooInstance }, expressions);
Was es tun soll:
- Verwenden Fabrik als Parameter angegeben und
Instantiate<T>()
Methode nennen. - Den zurückgegebenen Wert (eine foo-Instanz) in einer lokalen Variablen speichern.
- Dinge tun, auf diese lokale Variable
- Return die Instanz
Das Problem ist (in diesem Beispiel fehlt): Wenn ich kompilieren und rufen Sie den Ausdruck, Instantiate() nie aufgerufen. Der zurückgegebene Wert ist immer Null:
var method = Expression.Lambda<Func<FooFactory, Foo>>(finalExpr, factory).Compile();
Foo foo = method(new FooFactory()); //foo is null :(
Sie werfen die Aufgabe weg. Ausdrucksbäume sind rein deklarativ, keine Nebenwirkungen. – Luaan