是否有一种方法可以使用字符串作为类名来动态创建对象?Visual Basic:使用字符串作为名称动态创建对象
我已经离开VB好几年了,但为了解决另一种语言的问题,我不得不在这个开发包装。我有一个工厂方法来动态创建并返回基于来自其他地方的输入类型的对象。提供的输入是要从中创建对象的类名。正常的语法意味着整个类必须明确拼写出来。要做到这一点这种方式,可以从字面上有数百个,如果/然后是或案件处理中引用库中的所有可用类/对象的选择:
If c_name = "Button" then obj = new System.Windows.Forms.Button
If c_name = "Form" then obj = new System.Windows.Forms.Form
....
我希望,而不是减少所有这种情况下处理,以单行:IE浏览器...
my_class_name = "whateverclass"
obj = new System.Windows.Forms.my_class_name()
在PHP中,这是像这样处理......
$my_class_name = "whateverclass";
$obj = new $my_class_name();
编辑:纵观一些问题的答案,我觉得我在这里过着我的头。我还是设法得到它的工作使用Assembly类的this CreateInstance方法的变化,即使我更感兴趣的是this variation giving more options,包括提供构造参数...
my_type_name = "System.Windows.Forms.Button"
asmb_name = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
button1 = Reflection.Assembly.Load(asmb_name).CreateInstance(my_type_name)
换句话说,它需要一个方法来做这个,而不是任何固有的语言语法? This Activator variation在使用完整的组合字符串和类路径时也可以工作。我很可疑CreateInstance可能没有完全的能力让我把对象当作正常调用,例如obj = new System.Windows.Forms.Button
。这就是为什么我不能简单地使用CreateObject
。如果没有自然语言特征允许您用类名替换字符串,那么是否有人能够洞察使用CreateInstance
可以预期哪些限制?
另外,是否有基本的Activator.CreateInstance(Unwrap之后)和Assembly.CreateInstance方法之间的区别?
不错。 Form1_Load()'实际上将通过COM通过另一种语言处理。行o = Assembly.Load(ay).CreateInstance(fullyQualifiedClassName)'应该这样做。 – 2010-08-09 04:27:53