Можно ли в .net объявить переменную по имени строки класса, но без прямого имени класса? - PullRequest
0 голосов
/ 05 февраля 2012

Я хочу, чтобы такое волшебство происходило ...

class SomeClass {}

public static void main()

    MagicFunctionOrMacrosOrSomethingThatGetTypeOf("SomeClass") some_var = null;<br />
}

Может, это безумие, но возможно ли это?Мне нужно это, чтобы избежать сумасшедшего большого случая переключения, потому что имеет много классов, но в определенный момент кода не может сказать, какие классы создавать.Давайте приведем пример:У меня есть базовый класс:класс baseCLASS {}

имеет много дочерних классов:class class1: baseCLASS {}class class2: baseCLASS {}...class classn: baseCLASS {}есть некоторый флаг, который приходит извне к обработчику событий:строка имя_класса;// на самом деле я использую флаг int, который должен был быть связан с именами строк в словаре.заставили сделать это:

   switch(class_name)

   case "class1":
      class1 some_class = new class1();
      some_class.RunHandler();
      break;
   case "class2":
      class2 some_class = new class2();
      some_class.RunHandler();
      break;
   case "classn":
      classn some_class = new classn();
      some_class.RunHandler();
      break;
   }

Я хочу заменить этот большой оператор switch чем-то вроде этого:

MagicFunctionOrMacrosOrSomethingThatGetTypeOf(class_name) some_var = null;
... some initialization actions with some_var
some_var.Build();
some_var.RunHandler();

о боже ...

1 Ответ

0 голосов
/ 05 февраля 2012

У вас есть две проблемы:

  1. Учитывая данные, введенные пользователем, вы хотите создать экземпляр объекта переменного класса.Для этого вы хотите сопоставить пользовательский ввод и имя типа .NET.Для первого: вы можете использовать соглашение - убедитесь, что имя типа соответствует вводу;или вы можете использовать Dictionary<string,type> и заполнить его;или вы можете прикрепить атрибут к каждому классу, показывая, какой «глагол» он обрабатывает.Как только вы это сделаете, вы можете использовать Activator.CreateInstance, чтобы (во время выполнения) создать экземпляр вашего неизвестного класса.Это возвращает object.
  2. Вызов методов для неизвестного объекта.Либо определите базовый класс или общий интерфейс для классов (например, IRunnable или что-то в этом роде), либо используйте dynamic, что дает вам возможность вводить утки.
...