2011-12-01 11 views
7

Tengo problemas para crear un sub que pueda crear objetos de un tipo variable sobre la marcha. Aquí hay un ejemplo de lo que intento lograr:Sub para crear un objeto de tipo pasado por la persona que llama en VB.NET

class systemSettings 
    'some properties 
end class 

Class fireSystemSettings 
    inherits systemSettings 
    'some additional properties 
end class 

Class windSystemSettings 
    inherits systemSettings 
    'some additional properties 
end class 

sub createSystem(systemType as Type, arg1 as object, arg2 as object) 
    Dim newSystem as New systemType(arg1, arg2) 
    systemCollection.add(newSystem) 
end sub 

No puedo hacerlo funcionar. Investigué un poco y busqué tipos genéricos, reflexiones y otras herramientas, pero tengo problemas para determinar la mejor forma de abordar este problema.

+0

Considere el uso de genéricos en lugar de 'Tipo', si puede. ¿Qué está tratando de lograr? – SLaks

Respuesta

7

Usted está buscando Activator.CreateInstance(systemType)

+0

¿Puede esto manejar un constructor? Edité mi publicación original para mostrar que New toma 2 argumentos, un hecho que descuidé mostrar originalmente. – Michael

+0

Hay una sobrecarga que toma una matriz de objetos para los parámetros del constructor. 'Activator.CreateInstance (SomeType, New Object() {Param1, Param2})' –

2

Use genéricos para esto:

Sub createSystem(Of T As {New, systemSettings})() 
    Dim newSystem As New T 
    systemCollection.add(newSystem) 
End Sub 

y llamarlo con:

createSystem(Of windSystem) 

Para explicar:

El término Of T que permite crea un método que se pueda usar para cualquier tipo . Cada vez que lo llama para un nuevo valor de T, se crea un nuevo método en la memoria.

El término As {New, systemSettings} constriñe T. Dice que T debe representar un tipo que es o deriva de systemSettings. También dice que T debe contener un constructor predeterminado: New() que se requiere para el comando New T. Tenga en cuenta que no puede especificar un constructor más elaborado como una restricción de genéricos.

Si necesita parámetros en su constructor, puede crear un método Initialise en la clase base. Como T está restringido a systemSettings, se garantiza que existe el método Initialise.

Class systemSettings 
    Public Overridable Sub Initialise(arg1 As Object, arg2 As Object) 
     'initialise properties 
    End Sub 
    'some properties 
End class 

Class fireSystemSettings 
    Inherits systemSettings 
    Public Overrides Sub Initialise(arg1 As Object, arg2 As Object) 
     'initialise properties 
    End Sub 
    'some additional properties 
End Class 

Class windSystemSettings 
    Inherits systemSettings 
    Public Overrides Sub Initialise(arg1 As Object, arg2 As Object) 
     'initialise properties 
    End Sub 
    'some additional properties 
End Class 

Sub createSystem(Of T As {New, systemSettings})(arg1 As Object, arg2 As Object) 
    Dim newSystem As New T 
    newSystem.Initialise(arg1, arg2) 
    systemCollection.add(newSystem) 
End Sub 
+0

Entonces, si entiendo correctamente, este método crea esencialmente otro método que hereda el original, pero modifica el tipo de parámetros. Esto es interesante, sin embargo, descuidé mostrar en mi publicación original que el nuevo toma dos argumentos, y parece que de su última declaración, esta solución no funcionará. – Michael

+0

Eso es correcto. Vea mi respuesta para una solución a su nuevo problema. –

Cuestiones relacionadas