- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法使用字符串作为类名动态创建对象?
我已经离开 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();
编辑:看看一些答案,我想我已经无法理解了。我确实设法使用 this CreateInstance 让它工作Assembly 类的方法变体,尽管我对 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 - 视觉基本: dynamically create objects using a string as the name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3432317/
我是一名优秀的程序员,十分优秀!