返回与名称关联的对象

时间:2012-02-03 00:58:45

标签: .net vb.net activator createinstance

我正在将程序连接到一些外部代码。我正在设置它,以便外部代码可以实例化对象,我遇到了一个问题。我在这里创建了这个函数:

Public Function InstanceOf(ByVal typename As String) As Object
    Dim theType As Type = Type.GetType(typename)
    If theType IsNot Nothing Then
        Return Activator.CreateInstance(theType)
    End If
    Return Nothing
End Function

我正在尝试创建一个System.Diagnostics.Process对象。尽管如此,它始终返回Nothing而不是对象。有人知道我做错了吗?

我在VB.net中这样做,所以接受所有.net响应:)

2 个答案:

答案 0 :(得分:1)

仔细阅读the documentation of Type.GetType(),具体来说,请阅读以下部分:

  

如果 typeName 包含命名空间而不包含程序集名称,则此方法仅按顺序搜索调用对象的程序集和Mscorlib.dll。如果 typeName 使用部分或完整程序集名称完全限定,则此方法将在指定的程序集中搜索。如果程序集具有强名称,则需要完整的程序集名称。

由于System.Diagnostics.Process位于System.dll(而非Mscorlib.dll)中,因此您需要使用完全限定名称。假设您正在使用.Net 4.0,那将是:

System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

如果您不想使用完全限定名称,则可以浏览所有已加载的程序集并尝试使用Assembly.GetType()获取类型。

答案 1 :(得分:1)

您可以使用类似的东西来创建对象。

我定义了一个本地类,并使用了您的流程示例。

Public Class Entry
    Public Shared Sub Main()
        Dim theName As String
        Dim t As Type = GetType(AppleTree)
        theName = t.FullName
        Setup.InstanceOf(theName)

        t = GetType(Process)

        theName = t.FullName & ", " & GetType(Process).Assembly.FullName


        Setup.InstanceOf(theName)

    End Sub
End Class


Public Class Setup
    Shared function InstanceOf(typename As String) as object 
        Debug.Print(typename)
        Dim theType As Type = Type.GetType(typename)
        If theType IsNot Nothing Then
            Dim o As Object = Activator.CreateInstance(theType)
            '
            Debug.Print(o.GetType.ToString)
            return o
        End If
        return nothing 
    End function
End Class

Public Class AppleTree
    Public Sub New()
        Debug.Print("Apple Tree Created")
    End Sub
End Class