【发布时间】:2018-01-24 12:17:53
【问题描述】:
我正在编写一个项目,稍后将使用更多模块对其进行扩展,因此我希望尽可能多的代码是独立的,因此我正在使用各种方法来保持一切尽可能通用,并且不需要类型、类等的硬编码列表。
作为概念证明,我在一个类中提出了以下代码;
Public Class clsAddition
Public Function DoAction(Value1 As String, Value2 As String) As String
Dim dblTmpRet As Double
Dim strTmpRet As String = ""
If IsNumeric(Value1) = False Then strTmpRet += "Argument 'Value1' is not numeric. "
If IsNumeric(Value2) = False Then strTmpRet += "Argument 'Value2' is not numeric. "
If strTmpRet = "" Then
dblTmpRet = CDbl(Value1) + CDbl(Value2)
strTmpRet = CStr(dblTmpRet)
End If
Return strTmpRet
End Function
Private Function IsNumeric(Input As String) As Boolean
Dim blnTmpRet As Boolean
Try
Dim dblTest As Double = CDbl(Input)
blnTmpRet = True
Catch ex As Exception
blnTmpRet = False
End Try
Return blnTmpRet
End Function
Public Sub New()
MyBase.New()
End Sub
End Class
下面是windows窗体中的代码;
Private objObjectClass As Object
Private Sub cmdCreateObject_Click(sender As Object, e As EventArgs) Handles cmdCreateObject.Click
Dim assem As Assembly = GetType(Form1).Assembly
Dim typChosen As Type
Try
typChosen = assem.GetType(Me.comObjectType.SelectedItem.ToString, True)
Catch ex As Exception
typChosen = Nothing
End Try
If Not IsNothing(typChosen) Then
'found it
objObjectClass = Activator.CreateInstance(typChosen, True)()
Else
'didn't find it
Throw New Exception("Unable to locate type in assembly")
End If
End Sub
问题是,在 "Activator.CreateInstance(typChosen, True)()" 行,抛出以下错误
“System.MissingMemberException”类型的未处理异常 发生在 Microsoft.VisualBasic.dll 附加信息:否 找到类型“clsAddition”的默认成员
我的目标是能够创建类的实例,然后在它们上调用一个已知的名称函数。在此示例中,我将创建另一个名为“Divide”的类,或另一个名为“Concatinate”等的类,但是在实际程序中,这些类都将执行非常不同的操作,具有不同的属性、方法等,其中一个函数(上例中的“DoAction”)共享语法和返回类型。
请帮忙!一段时间以来一直在努力解决这个问题!
TIA!
【问题讨论】:
-
错误消息似乎表明您在错误的库 (Microsoft.VisualBasic.dll) 中查找类型“clsAddition”。您检查过,“组装”指向正确的程序集吗?
-
目前还不清楚为什么您喜欢 CreateInstance() 调用之后的额外 () 括号。显然你不知道,所以删除它们以获得成功。
-
@Nostromo 找到了类型引用,因为字符串值
Me.comObjectType.SelectedItem.ToString包含完整的命名空间(在本例中为“WindowsApplication1.clsAddition”)。 -
@HansPassant 您能否提交作为答案,以便我接受。我不敢相信它一直盯着我的脸!
标签: vb.net class reflection .net-assembly activator