Créer un délégué par reflection

Étant donné un assemblage qui contient

namespace Foo{public class Bar;} 

Comment créer une Action partir d’un autre assemblage sans faire référence au premier assemblage au moment de la compilation?

Si tu utilises

 Type barType = Type.GetType("Foo.Bar, whateverassembly"); Type actionType = typeof(Action<>).MakeGenericType(barType); 

actionType va maintenant représenter l’ Action . Cependant, pour l’utiliser, vous devrez continuer à utiliser la reflection. Vous devrez donc trouver un MethodInfo correspondant à la signature void(Foo.Bar) et appeler Delegate.CreateDelegate pour créer un délégué. Et vous aurez besoin de Delegate.DynamicInvoke pour l’exécuter.

 Delegate call = Delegate.CreateDelegate(actionType, ...); ... call.DynamicInvoke(someBar); 

Quelque chose me dit que ce n’est pas ce à quoi tu penses …

Vous ne pouvez pas l’appeler Action dans votre code d’appel, car vous n’aurez pas access à cette définition de type si vous ne la référencez pas à la compilation. Puisque les delegates sont contravariants, vous pouvez retourner une Action et l’utiliser, ou utiliser Action lorsque l’interface IBar est définie dans un assemblage référencé et implémentée par Foo.Bar .

Si vous retournez une Action , vous devrez soit utiliser les membres Foo.Bar via reflection (ou dynamic si vous utilisez C # 4.0), soit utiliser le Foo.Bar en Foo.Bar où le code de casting contient une référence à Foo.Bar est défini.