Jak utworzyć instancję klasy o nazwie string?
Mam klasę abstrakcyjną i chcę ją initalizować do klasy, która ją rozszerza.
Mam nazwę klas podrzędnych jako ciąg znaków.
Poza tym...String childClassString;
MyAbstractClass myObject;
if (childClassString = "myExtenedObjectA")
myObject = new ExtenedObjectA();
if (childClassString = "myExtenedObjectB")
myObject = new ExtenedObjectB();
Jak mogę to zrobić? W zasadzie jak pozbyć się tutaj stwierdzeń if? 3 answers
# Patrz aktywatorCreateInstance ().
myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");
Lub
var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-11 20:47:57
Uważam, że to powinno zadziałać:
myObject = (MyAbstractClass)Activator.CreateInstance(null, childClassString);
null
w pierwszym parametrze domyślnie jest wykonywanym złożeniem. Więcej informacji: MSDN
Edit: zapomniałem wrzucić do MyAbstractClass
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-11 20:53:20
Miałem pewne trudności z implementacją niektórych odpowiedzi tutaj, ponieważ próbowałem utworzyć instancję obiektu z innego zestawu (ale w tym samym rozwiązaniu). Więc pomyślałem, że wrzucę to, co znalazłem do pracy.
Po pierwsze, metoda Activator.CreateInstance
ma kilka przeciążeń. Wywołanie Activator.CreateInstance(Type.GetType("MyObj"))
zakłada, że obiekt jest zdefiniowany w bieżącym złożeniu i zwraca MyObj
.
Jeśli wywołasz go zgodnie z zaleceniami w odpowiedziach tutaj: Activator.CreateInstance(string AssemblyName, string FullyQualifiedObjectName)
, to zamiast tego zwróci ObjectHandle
, a Ty trzeba zadzwonić Unwrap()
na to, aby uzyskać swój obiekt. To przeciążenie jest przydatne podczas próby wywołania metody zdefiniowanej w innym złożeniu (BTW, możesz użyć tego przeciążenia w bieżącym złożeniu, po prostu zostaw parametr AssemblyName
null).
Odkryłem, że powyższa sugestia użycia typeof(ParentNamespace.ChildNamespace.MyObject).AssemblyQualifiedName
dla AssemblyName
faktycznie dała mi błędy, i nie mogłem tego uruchomić. DostaĹ 'bym System.IO.FileLoadException
(nie moĹźna Ĺ' adowaÄ ‡ Pliku ani montaĹźu...).
To co dostałem do pracy jest następujące:
var container = Activator.CreateInstance(@"AssemblyName",@"ParentNamespace.ChildNamespace.MyObject");
MyObject obj = (MyObject)container.Unwrap();
obj.DoStuff();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-02 22:58:20