É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.