由於BusManager
是通用類型,因此必須在編譯時指定傳入Of <type>
的類型。它不像傳統參數,您可以在運行時更改。
從你列出的代碼BusManager
實際上做了什麼還不清楚。如果它所做的只是創建一個Generic類型的實例,那麼創建它的人可能不會真正理解泛型。您是否有能力修改BusManager
的工作方式,還是僅限於按原樣使用它?
正如@jmoreno提到的,您可以使用反射從包含類型名稱的字符串中創建一個類型的實例。下面是如何將工作:
Imports System.Reflection
Imports System.IO
Public Class ObjectFactory
Private Shared Function CreateObjectFromAssembly(ByVal assembly As Assembly, ByVal typeName As String) As Object
' resolve the type
Dim targetType As Type = assembly.GetType(typeName)
If targetType Is Nothing Then
Throw New ArgumentException("Can't load type " + typeName)
End If
' get the default constructor and instantiate
Dim types(-1) As Type
Dim info As ConstructorInfo = targetType.GetConstructor(types)
Dim targetObject As Object = info.Invoke(Nothing)
If targetObject Is Nothing Then
Throw New ArgumentException("Can't instantiate type " + typeName)
End If
Return targetObject
End Function
Public Shared Function CreateObject(ByVal typeName As String) As Object
Return CreateObjectFromAssembly(Assembly.GetExecutingAssembly, typeName)
End Function
Public Shared Function CreateObject(ByVal typeName As String, ByVal assemblyFileName As String) As Object
Dim assemblyFileInfo = New FileInfo(assemblyFileName)
If assemblyFileInfo.Exists Then
Return CreateObjectFromAssembly(Reflection.Assembly.LoadFrom(assemblyFileName), typeName)
Else
Throw New ArgumentException(assemblyFileName + " cannot be found.")
End If
End Function
End Class
在生產應用程序,我可能會設置返回類型爲所有的這些方法,我的基類或接口。只要確保你傳遞完整的typeName
包括命名空間。
有了這一工廠類,那麼你的代碼的優雅版會是這個樣子:
Dim myItem as DTO.MyBaseClass = ObjectFactory.CreateObject("DTO." & GetTypeString())
哇,看起來不錯,謝謝一堆! – 2011-06-02 19:32:17