Bonjour,
je me remets au C# après 2 ans d'abandon et je tombe sur un problème qui me fait caler:
j'ai "besoin" (il ne s'agit que d'une appli de test pour me remettre dans le bain) d'instancier un objet dont le type est fourni dans un fichier de configuration, dans le but de faire une architecture modulaire et modifiable sans recompilation...
bref...
- j'ai une interface très simple DicesSim.UI.IUsable
- j'ai une classe pas bien plus compliquée DicesSim.UI.DicesConsole qui implémente cette interface:Code:using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DicesSim.UI { interface IUsable { void show(); } }
le but est de pouvoir faire différentes interfaces utilisateur parmi lesquelles on puisse choisir simplement en précisant laquelle on veut utiliser dans un fichier de config.Code:using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DicesSim.UI { public class DicesConsole : IUsable { ...
j'ai veux donc créer une instance de la classe dans le nom est indiquée dans le fichier de config sous forme de chaine et caster cette instance en IUsable pour utiliser indifféremment toute classe implémentant mon interface IUsable.
pour ça:
- je déclare une variable _UI de type IUsable dans une autre classe pour référencer l'instance de l'interface utilisateur et je l'initialise à null.
- je créée l'instance de la classe voulue par
type contient un object Type pointant la classe type contient un object Type pointant la classe DicesSim.UI.DicesConsole et si je regarde au debugger, l'instruction Activator.CreateInstance(type) est évaluée comme object {DicesSim.UI.DicesConsole}.Code:this._UI = (IUsable)Activator.CreateInstance(type);
seulement voila, bien que DicesConsole implemente IUsable, le cast me lève une exception:
en cherchant un peu, j'ai lu que cela pouvait venir du fait que l'interface et la classe qui l'implémente n'étaient pas dans le même assembly, ce qui était effectivement le cas chez moi. mais j'ai testé de copier l'interface directement dans le projet ou elle est utilisée et ça ne fonctionne pas mieux.Envoyé par VC# Express
je me demande donc si quelqu'un peut m'expliquer comment caster un objet en une interface implémentée par son type, ou a défaut de m'indiquer une autre façon d'instancier un objet à partir d'une chaine de caractère contenant son type, ou plus largement une manière de choisir par fichier de config quelle classe utiliser pour une tache donnée.
merci de m'avoir lu, a+
-----