Instanciation d'Interface à la volée
Bonjour,
Je travaille sur un projet qui doit pouvoir loader des assembly (Workers) à la demande dans un repertoire.
La solution du serveur contient un projet "WorkerInterface" qui contient seulement la déclaration de mon Interface IWorker.
J'ai aussi un projet A dont la classe Travailleur implemente IWorker.
Mon serveur parcours un repertoire à la recherche d'assemblies, récupère leurs types et vérifie qu'ils implémentent l'interface voulue.
Si c'est le cas, on l'instancie pour le faire travailler.
Première blague (pour laquelle je cherche une explication):
Après recherche sur internet, vérifier qu'une assembly implemente une interface, c'est assez simple:
Code:
1 2 3 4 5 6 7 8 9
|
Assembly assembly = Assembly.LoadFrom(assemblyPath);
foreach (Type loadedType in assembly.GetTypes())
{
Type interf = loadedType.GetInterface(typeof(IWorker).FullName);
if (interf != null)
// On en a trouvé un !
} |
Et oui: 'IsAssignableFrom', 'as', 'is', '==' et 'GetGenericTypeDefinition': toutes ces solutions me renvoient un false quand je vérifie si ça match... :(
Seconde blague (pour laquelle je cherche une alternative):
Quand j'en ai trouvé un, je veux l'instancier:
Code:
1 2 3 4 5
|
object newWorker = Activator.CreateInstance(loadedType);
IWorker worker = newWorker as IWorker;
if (worker != null)
mWorkers.Add(worker); |
J'avais commencé par la version courte avec les cast direct, mais ça marche pas (pas plus que cette version).
Mais je ne comprends pas pourquoi !
Quand je passe dans ce code en pas à pas, l'object retourné par le CreateInstance présente bien mes méthodes de IWorker,
mais il refuse de le caster à la ligne du dessous.
je suis pourtant pas fou:
Code:
1 2
|
public class Travailleur : IWorker |
Je me doute que j'ai zappé une étape, mais je vois pas où...
Toute aide ou remarque (même délirante) est la bienvenue !
Merci d'avance