1 votes

Comment invoquer dynamiquement une chaîne de délégués en VB.NET ?

Quelqu'un sait-il s'il est possible de créer dynamiquement une chaîne d'appel et de l'invoquer ?

Disons que j'ai deux classes A et B :

public class A
    public function Func() as B
        return new B()
    end function
end class

public class B
   public function Name() as string
      return "a string";
   end function
end class

Je veux être capable d'obtenir MethodInfo pour les deux Func() & Nom() et les invoquer dynamiquement afin d'obtenir un appel similaire à A.Func().Name() .

Je sais que je peux utiliser Delegate.CreateDelegate pour créer un délégué que je peux invoquer à partir des deux MethodInfo mais de cette façon, je ne peux appeler les deux fonctions que séparément et non dans le cadre d'une chaîne d'appels.

J'aimerais avoir deux solutions, l'une pour .NET 3.5 utilisant l'arbre d'expression et, si possible, une solution qui soit également compatible avec .NET 2.0.

2voto

Jon Skeet Points 692016

Utilisez-vous .NET 3.5 ? Si c'est le cas, il devrait être relativement simple de construire un arbre d'expression pour représenter ceci. Je n'ai pas assez d'expérience en matière d'arbres d'expression pour écrire facilement l'arbre pertinent sans VS ouvert, mais si vous confirmez que c'est une option, je vais me mettre au travail dans le bloc-notes (depuis mon Eee... d'où l'absence de VS).

EDIT : Ok, en tant qu'arbre d'expression, vous voulez quelque chose comme (code C#, mais je suis sûr que vous pouvez traduire) :

// I assume you've already got fMethodInfo and nameMethodInfo.
Expression fCall = Expression.Call(null, fMethodInfo);
Expression nameCall = Expression.Call(fCall, nameMethodInfo);
Expression<Func<string>> lambda = Expression.Lambda<Func<string>>(nameCall, null);
Func<string> compiled = lambda.Compile();

Ce n'est pas testé, mais je pense que ça devrait marcher...

0voto

Dror Helper Points 15499

Vous devez ajouter cette ligne avant la première expression :

Expression ctorCall = Expression.Constructor(A)

Et passer cette expression comme le 1er paramètre lors de la création de fCall

Sinon, il nous manque un point de départ pour la chaîne et nous obtiendrons une exception lors de l'exécution du code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X