miałem pewne trudności wykonawczych niektóre odpowiedzi tutaj, ponieważ starałem się instancję obiektu z innego zespołu (ale w tym samym roztworze). Pomyślałem więc, że opublikuję to, co znalazłem.
Po pierwsze, metoda Activator.CreateInstance
ma kilka przeciążeń. Po prostu zadzwoń pod numer Activator.CreateInstance(Type.GetType("MyObj"))
, który zakłada, że obiekt jest zdefiniowany w bieżącym złożeniu i zwraca wartość MyObj
.
Jeśli nazywasz to zalecanym w odpowiedzi tutaj: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, to zamiast tego zwraca ObjectHandle
, i musisz wywołać Unwrap()
na nim, aby uzyskać swój obiekt. To przeciążenie jest przydatne przy próbie wywołania metody zdefiniowanej w innym zestawie (BTW, można użyć tego przeciążenia w bieżącym złożeniu, po prostu pozostaw parametr null wartością AssemblyName
).
Teraz odkryłem, że powyższa sugestia, aby użyć typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
dla AssemblyName
faktycznie dała mi błędy, i nie mogłem tego zrobić. Dostałbym System.IO.FileLoadException
(nie można załadować pliku lub zespołu ...).
Co mogę dostać się do pracy jest następujący:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
Dlaczego trzeba instanciate swoją klasę z ciągiem? W zależności od Twojego przypadku, mogą pojawić się "czystsze" rozwiązania, szczególnie jeśli nie chcesz używać refleksji. –
@SylvestreEquy, ale może w czyichś sprawach, to tylko rozwiązanie ... Pytania na SO nie służą tylko tym, którzy ich proszą. –