在.net中是否可以通过类字符串名称声明变量,但没有直接的类名?

时间:2012-02-05 16:05:22

标签: string variables text declare

我希望像这样发生魔法......

class SomeClass {}

public static void main()

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

也许这很疯狂,但有可能吗? 我需要它来避免疯狂的大型开关案例,因为有很多类,但在某些代码点无法分辨出要创建的类。

我们举个例子:
我有基类:
class baseCLASS {}

有很多子课:
class class1:baseCLASS {}
class class2:baseCLASS {}
...
class classn:baseCLASS {}

有一些来自外部的事件处理程序标志:
string class_name; //实际上我使用的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 :(得分:0)

你有两个问题:

  1. 根据用户输入,您希望实例化不同类的对象。为此,您需要在用户输入和.NET类型名称之间进行映射。对于第一个:您可以使用约定 - 确保类型名称与输入匹配;或者您可以使用Dictionary<string,type>并填充它;或者你可以为每个类附加一个属性,显示它处理的“动词”。完成后,您可以使用Activator.CreateInstance(在运行时)创建未知类的实例。这将返回object
  2. 调用未知对象的方法。为类定义基类或公共接口(例如IRunnable或其他东西),或者使用dynamic,这样可以为您打字。