Ho avuto qualche difficoltà l'attuazione di alcune delle risposte qui perché stavo cercando di un'istanza di un oggetto da un assembly diverso (ma nella stessa soluzione). Così ho pensato di pubblicare ciò che trovavo al lavoro.
Innanzitutto, il metodo Activator.CreateInstance
ha diversi sovraccarichi. Se si chiama semplicemente Activator.CreateInstance(Type.GetType("MyObj"))
, si presuppone che l'oggetto sia definito nell'assieme corrente e restituisce un valore MyObj
.
Se lo si chiama come raccomandato nelle risposte qui: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, allora invece restituisce un ObjectHandle
, ed è necessario chiamare Unwrap()
su di esso per ottenere il vostro oggetto. Questo sovraccarico è utile quando si tenta di chiamare un metodo definito in un assembly diverso (BTW, è possibile utilizzare questo overload nell'assieme corrente, lasciare il parametro AssemblyName
null).
Ora, ho trovato che il suggerimento di cui sopra per utilizzare typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
per AssemblyName
in realtà mi ha dato errori, e non ho potuto farlo funzionare. Otterrei System.IO.FileLoadException
(impossibile caricare file o assembly ...).
Quello che ho fatto andare al lavoro è la seguente:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
fonte
2017-04-02 22:58:20
Perché è necessario instanciate la classe con una corda? A seconda del caso, potrebbero esserci soluzioni "più pulite", soprattutto se non si è riluttanti all'utilizzo del riflesso. –
@SylvestreEquy ma forse nei casi di qualcun'altro, questa è solo la soluzione ... Le domande su SO non servono solo a chi le chiede. –