Dado que BusManager
es un genérico, el tipo que pase a Of <type>
debe especificarse en el momento de la compilación. No es como un parámetro tradicional que puede cambiar en tiempo de ejecución.
No está claro en el código que aparece lo que BusManager
realmente hace. Si todo lo que hace es crear una instancia del tipo Genérico, entonces tal vez la persona que lo creó realmente no entienda los genéricos. ¿Tiene la capacidad de volver a trabajar cómo funciona el BusManager
, o está limitado a usarlo tal cual?
Como se menciona en @jmoreno, puede usar la reflexión para crear una instancia de un tipo a partir de una cadena que contenga el nombre del tipo. Aquí es cómo funcionaría:
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
En una aplicación de producción, lo que probablemente establezca el tipo de cambio de todos estos métodos a mi clase base o interfaz. Solo asegúrese de pasar el typeName
completo incluyendo el espacio de nombres.
Con esa clase de fábrica en su lugar, a continuación, la versión elegante de su código sería algo como esto:
Dim myItem as DTO.MyBaseClass = ObjectFactory.CreateObject("DTO." & GetTypeString())
Wow se ve bien, ¡muchas gracias! –