Вернуть объект, связанный с именем - PullRequest
0 голосов
/ 03 февраля 2012

Я подключаю свою программу к внешнему коду. Я настраиваю его так, чтобы внешний код мог создавать экземпляры объектов, и я столкнулся с проблемой. Я создал эту функцию здесь:

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 принимаются :) 1008 *

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

вы можете использовать что-то подобное для создания своих объектов.

Я определил локальный класс, а также использовал ваш пример процесса.

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
1 голос
/ 03 февраля 2012

Внимательно прочитайте документацию 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().

...