Expression d'arbres et invocation d'un délégué
J'ai donc un delegate
qui points à une fonction dont je ne sais pas vraiment quand je d'abord créer le delegate
objet. L'objet est défini à une fonction plus tard.
J'ai aussi envie de faire une arborescence d'expression qui appelle le délégué à l'aide d'un argument (pour cette question, l'amour de l'argument peut être 5
). C'est ce que je suis aux prises avec; le code ci-dessous montre ce que je veux mais ça ne compile pas.
Func<int, int> func = null;
Expression expr = Expression.Invoke(func, Expression.Constant(5));
Pour cet exemple, je pourrais faire (c'est pratique car j'ai besoin de construire l'expression d'arbres lors de l'exécution):
Func<int, int> func = null;
Expression<Func<int>> expr = () => func(5);
Ce fait expr
devenir:
() => Invoke(value(Test.Program+<>c__DisplayClass0).func, 5)
Qui semble signifier que l'utilisation de la delegate
func
j'ai besoin de produire de la value(Test.Program+<>c__DisplayClass0).func
peu.
Alors, comment puis-je faire une arborescence d'expression qui invoque un délégué?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Je pense que ce que vous voulez faire est d'utiliser la Cible et la Méthode des propriétés du délégué de passe pour créer un Appel d'expression. Bâtiment sur JulianR de l'échantillon, c'est ce à quoi il pourrait ressembler:
OK, cela montre combien il peut être fait (mais c'est très inélégant à mon avis):
Essentiellement, je l'ai utiliser
(x) => func(x);
de faire une fonction qui s'appelle ce que le délégué de points. Mais vous pouvez voir queexpr
est trop compliqué. Pour cette raison, je ne considère pas que cette réponse est la bonne, mais peut-être il peut être construit sur?Cela devrait fonctionner:
Expressions peuvent être un mindfuck, mais n'oubliez pas: expressions sont toujours construites sur d'autres expressions. Une expression est un arbre à d'autres expressions qui décrit code. Vous ne pouvez pas passer dans le réel délégué comme vous le faites dans votre exemple, ce que vous avez besoin est une expression de ce délégué, en disant que l'expression attend un paramètre de type de votre délégué. Ensuite, vous dites que vous voulez appeler une méthode sur ce paramètre, à savoir le
Invoke
méthode, avec l'argument '5'. Tous les autres trucs après c'est juste si vous voulez faire de cette expression exécutable, code, dont vous n'avez probablement.J'ai couru avec .NET4 bien, j'espère que je n'ai pas mélangé dans .NET4 seulement l'expression des trucs.
MODIFIER En réponse à PythonPower commentaire:
Je pense que ce que vous voulez (pas de passage dans l'délégué comme argument) ne peut être fait que lorsque le délégué lui-même est décrit comme une expression, comme ceci:
Le seul autre moyen que je peux penser à est de capturer un délégué a déclaré localement par une fermeture, mais je ne sais pas comment faire.