首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual :使用字符串作为名称动态创建对象

Visual :使用字符串作为名称动态创建对象
EN

Stack Overflow用户
提问于 2010-08-07 22:38:27
回答 3查看 40.4K关注 0票数 8

是否有一种使用字符串作为类名动态创建对象的方法?

我已经离开VB几年了,但是为了解决另一种语言的问题,我不得不在这个语言中开发一个包装器。我有一个工厂方法,可以根据来自其他地方的输入动态地创建和返回一个类型的对象。提供的输入是用来创建对象的类名。普通语法意味着必须对整个类进行显式拼写。要做到这一点,实际上可能会有数百个if/ To的或多个案例来处理引用库中所有可用的类/对象选择:

代码语言:javascript
复制
If c_name = "Button" then obj = new System.Windows.Forms.Button
If c_name = "Form" then obj = new System.Windows.Forms.Form
....

我希望能把所有的案件处理简化成一行:呃.

代码语言:javascript
复制
my_class_name = "whateverclass"
obj = new System.Windows.Forms.my_class_name()

在PHP中,这是这样处理的.

代码语言:javascript
复制
$my_class_name = "whateverclass";
$obj = new $my_class_name();

编辑:看了看一些答案,我觉得我在这里太过分了。虽然我对这个CreateInstance更感兴趣,包括提供构造参数,但我还是设法使用了装配类的这种变化提供了更多的选择方法变体.

代码语言:javascript
复制
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方法之间是否有区别?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-07 23:52:40

这可能会执行您想要的/测试的工作;将顶部的类型注释切换到查看。

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2010-08-07 23:07:18

看看Activator.CreateInstance(Type)方法。

如果您的输入是一个类的名称,您应该能够这样做:

代码语言:javascript
复制
Dim obj As Object = Activator.CreateInstance(GetType("Name_Of_Your_Class")) 

您将不得不修改GetType调用,以确保您提供了足够的信息,但在大多数情况下,只需使用类的名称即可。

票数 0
EN

Stack Overflow用户

发布于 2016-03-04 14:56:33

在网上搜索的时候,我发现了一个非常简单的方法:

代码语言:javascript
复制
dynamicControl = Activator.CreateInstance(Type.GetType("MYASSEMBLYNAME." + controlNameString))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3432317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档