有没有办法使用字符串作为类名动态创建对象?

我已经离开 VB 好几年了,但是为了用另一种语言解决问题,我不得不用这种语言开发一个包装器。我有一个工厂方法,可以根据其他地方的输入动态创建和返回一个类型的对象。提供的输入是用来创建对象的类名。正常语法意味着必须明确说明整个类。要这样做,实际上可能有数百个 if/then 或 case 来处理引用库中所有可用的类/对象选择:

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 方法之间是否有区别?

最佳答案

这可能会做你想要/测试的工作;切换顶部的类型注释以查看。

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

关于vb.net - Visual Basic : dynamically create objects using a string as the name,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3432317/

10-10 05:57