Je ces interface simple:Faire une expression lambda pour appeler une méthode d'une classe générique
public interface IQuery<TResult> { }
public interface IQueryHandler<in TQuery, out TResult>
where TQuery : IQuery<TResult> {
TResult Handle(TQuery query);
}
Et il y a une mise en œuvre d'entre eux. J'essaye de créer une expression-arbre pour appeler la méthode Handle
sur un gestionnaire indiqué. Je veux dire:
var query = new MyQuery(); // which MyQuery implements IQuery<int>
object handler = _someServiceProvider
.Get<IQueryHandler<MyQuery, int>>();
En outre, il y a une MyQueryHandler
:
public class MyQueryHandler : IQueryHandler<MyQuery, int> {
public int Handle(MyQuery query) { return 20; }
}
Maintenant, je suis en train de créer un Func<object, MyQuery, int>
appeler comme ceci:
var func = GetMethod<MyQuery, int>(handler);
var result = func(handler, query);
Et voici mon GetMethod
mise en œuvre:
private Func<object, TQuery, TResult> GetMethod<TQuery, TResult>(object obj)
where TQuery : IQuery<TResult> {
var methodInfo = obj.GetType().GetMethod(nameof(IQueryHandler<TQuery, TResult>.Handle));
var insExp = Expression.Parameter(typeof(object), "ins");
var inputExp = Expression.Parameter(typeof(TQuery), "query");
var instanceExp = Expression.Variable(obj.GetType(), "instance");
var assExp = Expression.Assign(instanceExp, Expression.Convert(insExp, obj.GetType()));
var castExp = Expression.Convert(inputExp, methodInfo.GetParameters()[0].ParameterType);
var callExp = Expression.Call(instanceExp, methodInfo, castExp);
var blockExp = Expression.Block(new Expression[] {
insExp,
inputExp,
instanceExp,
assExp,
castExp,
callExp
});
var func =
Expression.Lambda<Func<object, TQuery, TResult>>(
blockExp,
insExp,
inputExp).Compile();
return func;
}
Mais, quand je tente de compiler Lambda
, je reçois cette erreur:
An exception of type 'System.InvalidOperationException' occurred in System.Core.dll but was not handled in user code
Additional information: variable 'instance' of type 'Namespace.MyQueryHandler' referenced from scope '', but it is not defined
Où suis-je tort? Qu'est-ce que j'ai manqué? Avez-vous une idée? Merci d'avance.
pourquoi avez-vous besoin de fusionner l'expression des arbres à cela? il semble que trop de complication – MBoros