Créer un objet en ne connaissant que le nom de la classe?
J'ai un ensemble de classes, chacune est différente stratégie pour faire le même travail.
namespace BigCorp.SuperApp
{
public class BaseClass { }
public class ClassA : BaseClass { }
public class ClassB : BaseClass { }
}
Le choix de la stratégie à utiliser est configurable. Je veux configurer uniquement le nom de la classe 'ClassB" au lieu du nom complet du type 'BigCorp.SuperApp.ClassB " dans l'application.fichier de configuration.
<appConfig>
<SuperAppConfig>
<Handler name="ClassB" />
</SuperAppConfig>
</appConfig>
Cependant, la réflexion échouent parce qu'ils attendent le nom complet du type, en particulier
Type t = Type.GetType("ClassB"); //results in t == null
BaseClass c = Activator.CreateInstance(t) as BaseClass; //fails
Comment puis-je obtenir que cela fonctionne lors de la configuration seulement le nom de la classe? Concaténer l'espace de noms pour le nom de la classe pour le nom complet du type? Est-il un autre appel de réflexion qui fonctionne?
Si vous pensez que c'est inutile et je devrais attendre la configuration pour contenir le nom complet du type, je suis ouvert à cette solution! Il suffit de fournir la justification de me convaincre.
(Je ne vais pas être le chargement d'un type à partir de l'extérieur de cette assemblée/espace de noms)
source d'informationauteur Anthony Mastrean | 2008-11-17
Vous devez vous connecter pour publier un commentaire.
Puisque vous savez que toutes les classes sur le même espace de noms, de le configurer une fois et l'utiliser:
Edit: j'ai changé nom à classe pour mieux indiquer la signification de l'attribut.
Soit utiliser l'assemblée qualifiés-nom, ou obtenir de l'Assemblage et de l'utilisation
Assembly.GetType(name)
. Dans ce cas, puisque vous voulez que les types dans le fichier de configuration, assemblage qualifié est un moyen valable d'y aller - mais puisque vous savez que tous vos types sont dans la même assemblée:La statique
Type.GetType(string)
a sonder les règles qui prêtent souvent à confusion... il ressemble à la convocation de l'assemblée, et un peu de système d'assemblages - mais pas tous chargés assemblées.en raison de la ligne ci-dessus, il est sûr de supposer que vous savez ce que l'espace de noms est. Ne pourriez-vous pas faire quelque chose comme:
Si vous vous attendez peut-être en mesure d'ajouter d'autres stratégie de classes pour être chargé dans l'avenir, peut-être via un assemblage supplémentaire, vous avez besoin pour obtenir votre nom de classe. Il est recommandé de toute façon, depuis que vous seriez en mesure de fournir une meilleure extensibilité pour votre application.
Je vais avec le nom complet du type dans la configuration de l'application. Ci-dessous est un peu plus complet, mais encore l'exemple trivial
Et l'usine de la classe qui crée réellement ce
Peut également résulter du fait que la méthode CreateInstance ne pas retourner une instance de BaseClass, plutôt qu'une instance de BaseClass enveloppé dans un ObjectHandle.
Jeté dans votre BaseClass après que vous avez utilisé la méthode UnWrap.