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?
Author: Robert Harvey, 2010-02-11

3 answers

# Patrz aktywatorCreateInstance ().

myObject = (MyAbstractClass)Activator.CreateInstance("AssemblyName", "TypeName");

Lub

var type = Type.GetType("MyFullyQualifiedTypeName");
var myObject = (MyAbstractClass)Activator.CreateInstance(type);
 99
Author: Seth Petry-Johnson,
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

 19
Author: IAbstract,
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();
 2
Author: Kevin Fichter,
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