J'ai eu quelques difficultés à mettre quelques-unes des réponses ici parce que je cherchais à instancier un objet à partir d'un ensemble différent (mais dans la même solution). J'ai donc pensé poster ce que j'ai trouvé au travail.
Premièrement, la méthode Activator.CreateInstance
a plusieurs surcharges. Si vous appelez simplement Activator.CreateInstance(Type.GetType("MyObj"))
, cela suppose que l'objet est défini dans l'assembly en cours et il renvoie un MyObj
.
Si vous l'appelez comme recommandé dans les réponses ici: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, alors il renvoie à la place un ObjectHandle
, et vous devez appeler Unwrap()
dessus pour obtenir votre objet. Cette surcharge est utile lorsque vous essayez d'appeler une méthode définie dans un assembly différent (BTW, vous pouvez utiliser cette surcharge dans l'assembly en cours, laissez simplement le paramètre AssemblyName
null).
Maintenant, j'ai trouvé que la suggestion ci-dessus pour utiliser typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
pour AssemblyName
m'a effectivement donné des erreurs, et je ne pouvais pas obtenir que cela fonctionne. J'obtiendrais System.IO.FileLoadException
(impossible de charger le fichier ou l'assemblage ...).
Ce que je ne se rendre au travail est la suivante:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
Pourquoi avez-vous besoin d'instancier votre classe avec une chaîne? Selon votre cas, il pourrait y avoir des solutions «plus propres», surtout si vous n'êtes pas réticent à utiliser la réflexion. –
@SylvestreEquy mais peut-être dans les cas de quelqu'un d'autre, c'est juste la solution ... Les questions sur SO ne servent pas seulement ceux qui leur demandent. –