Puis-je utiliser Activator.CreateInstance avec une interface?
J'ai un exemple:
Assembly asm = Assembly.Load("ClassLibrary1");
Type ob = asm.GetType("ClassLibrary1.UserControl1");
UserControl uc = (UserControl)Activator.CreateInstance(ob);
grd.Children.Add(uc);
Là, je suis de la création d'une instance d'une classe, mais comment puis-je créer une instance d'une classe qui implémente une interface? c'est à dire UserControl1 implémente ILoad interface.
U: je peux cast de l'objet à l'interface plus tard, mais je ne sais pas quel type dans les assemblées implémente l'interface.
source d'informationauteur Arman Hayots
Vous devez vous connecter pour publier un commentaire.
C'est un code que j'ai utilisé quelques fois. Il trouve tous les types dans une assemblée de mettre en œuvre un certain interface:
Alors vous avez tous les types de ClassLibrary1 que de mettre en œuvre
ILoad
.Vous pouvez ensuite instancier tous:
Vous ne pouvez pas créer une instance d'une interface, mais si
vous pouvez utiliser l'objet comme
ILoad
En outre, vous n'avez pas besoin de la traiter via l'interface, si vous écrivez
Membres de
ILoad
serait exigible queuc.SomeILoadMethod();
Ce que vous voulez peut être réalisé à l'aide d'un conteneur IoC comme "NInject'.
Vous pouvez configurer un conteneur retourner un type de béton lorsque vous avez demandé une interface.
Interface est une interface. C'est un modèle. Pourquoi voudriez-vous pour instancier une interface? Implémenter l'interface et l'instanciation de cette classe. Vous ne pouvez pas instancier une interface, il n'a pas vraiment de sens.
Le seul problème que l'on a accepté la réponse est que vous devez avoir un béton de classe de votre assemblée qui implémente l'interface.
Pour éviter que j'ai créé mon CustomActivator qui est capable de créer un objet dynamique lors de l'exécution et de la rendre implémente l'interface souhaitée.
Je l'ai mis sur le github:
https://github.com/fabriciorissetto/CustomActivator
L'appel est simple:
Si la bibliothèque a été référencé dans le projet, vous pouvez utiliser: