【问题标题】:No default member found for type '' when using Activator.Instance使用 Activator.Instance 时未找到类型“”的默认成员
【发布时间】: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


【解决方案1】:

根据 Hans Passant 的评论,这是由于以下行中的额外括号;

Activator.CreateInstance(typChosen, True)()

把它改成 ;

Activator.CreateInstance(typChosen, True)

解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多