是否有一种使用字符串作为类名动态创建对象的方法?
我已经离开VB几年了,但是为了解决另一种语言的问题,我不得不在这个语言中开发一个包装器。我有一个工厂方法,可以根据来自其他地方的输入动态地创建和返回一个类型的对象。提供的输入是用来创建对象的类名。普通语法意味着必须对整个类进行显式拼写。要做到这一点,实际上可能会有数百个if/ To的或多个案例来处理引用库中所有可用的类/对象选择:
If c_name = "Button" then obj = new System.Windows.Forms.Button
If c_name = "Form" then obj = new System.Windows.Forms.Form
....我希望能把所有的案件处理简化成一行:呃.
my_class_name = "whateverclass"
obj = new System.Windows.Forms.my_class_name()在PHP中,这是这样处理的.
$my_class_name = "whateverclass";
$obj = new $my_class_name();编辑:看了看一些答案,我觉得我在这里太过分了。虽然我对这个CreateInstance更感兴趣,包括提供构造参数,但我还是设法使用了装配类的这种变化提供了更多的选择方法变体.
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)换句话说,它需要一个方法来实现这一点,而不是任何固有的语言语法?这种激活剂的变化在使用完整的程序集字符串和类路径时也能工作。我很怀疑,CreateInstance可能没有完全的能力让我像对待正常的对象一样对待它们(即obj = new System.Windows.Forms.Button )。这就是为什么我不能使用简单的CreateObject。如果没有自然语言特性允许您用类名代替字符串,那么有谁能深入了解使用CreateInstance会带来什么样的限制呢?
另外,基本的Activator.CreateInstance (在解包之后)和Assembly.CreateInstance方法之间是否有区别?
发布于 2010-08-07 23:52:40
这可能会执行您想要的/测试的工作;将顶部的类型注释切换到查看。
Imports System.Reflection
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' Dim fullyQualifiedClassName as String = "System.Windows.Forms.TextBox"
Dim fullyQualifiedClassName As String = "System.Windows.Forms.Button"
Dim o = fetchInstance(fullyQualifiedClassName)
' sometime later where you can narrow down the type or interface...
Dim b = CType(o, Control)
b.Text = "test"
b.Top = 10
b.Left = 10
Controls.Add(b)
End Sub
Private Function fetchInstance(ByVal fullyQualifiedClassName As String) As Object
Dim nspc As String = fullyQualifiedClassName.Substring(0, fullyQualifiedClassName.LastIndexOf("."c))
Dim o As Object = Nothing
Try
For Each ay In Assembly.GetExecutingAssembly().GetReferencedAssemblies()
If (ay.Name = nspc) Then
o = Assembly.Load(ay).CreateInstance(fullyQualifiedClassName)
Exit For
End If
Next
Catch
End Try
Return o
End Function发布于 2010-08-07 23:07:18
看看Activator.CreateInstance(Type)方法。
如果您的输入是一个类的名称,您应该能够这样做:
Dim obj As Object = Activator.CreateInstance(GetType("Name_Of_Your_Class")) 您将不得不修改GetType调用,以确保您提供了足够的信息,但在大多数情况下,只需使用类的名称即可。
发布于 2016-03-04 14:56:33
在网上搜索的时候,我发现了一个非常简单的方法:
dynamicControl = Activator.CreateInstance(Type.GetType("MYASSEMBLYNAME." + controlNameString))https://stackoverflow.com/questions/3432317
复制相似问题