2010-03-07 43 views
6

He buscado una respuesta y encontré algunos C# -examples, pero no pudieron conseguir este funcionamiento en vb.net:crear una nueva instancia de un tipo dado como parámetro

pensé en algo así como lo siguiente:

public function f(ByVal t as System.Type) 
    dim obj as t 
    dim a(2) as t 

    obj = new t 
    obj.someProperty = 1 
    a(0) = obj 

    obj = new t 
    obj.someProperty = 2 
    a(1) = obj 

    return a 
End Function 

lo sé, lo puede crear una nueva instancia con el Activator.Create ... métodos, pero la forma de crear una matriz de este tipo o simplemente declarar una nueva variable? (tenue)

¡Gracias de antemano!

Respuesta

14

Realmente depende del tipo en sí. si el tipo es un tipo de referencia y tiene un constructor vacío (un constructor aceptar cero argumentos), el siguiente código debe crear un insance de ella: Uso de Generics:

Public Function f(Of T)() As T 
    Dim tmp As T = GetType(T).GetConstructor(New System.Type() {}).Invoke(New Object() {}) 
    Return tmp 
End Function 

Uso de un parámetro de tipo:

Public Function f(ByVal t As System.Type) As Object 
    Return t.GetConstructor(New System.Type() {}).Invoke(New Object() {}) 
End Function 
+0

@ M.A. La respuesta de Hanin es genial, definitivamente usa la versión genérica si puedes. En lugar de .Invoke (New Object()) Creo que necesita usar .Invoke (Nothing). Además, dicho todo esto, el 99% de las veces que veo a alguien hacer esto lo hace por la razón equivocada o está haciendo algo realmente difícil. La reflexión es útil en un puñado de situaciones, pero la mayoría de las veces hace que el código sea mucho más confuso. –

+0

¡Esta respuesta es exactamente lo que necesitaba! Todavía estoy tratando de obtener http://stackoverflow.com/questions/2386690/method-to-override-shared-members-in-child-classes/2387070 en funcionamiento, por lo que parece ser una solución. – stex

+0

@Stex, me alegro de poder ayudar. Con respecto a esa otra pregunta, he propuesto otra solución, pero ahora veo que podría ser irrelevante. @Chris Haas, gracias por tu comentario. Creo que tienes razón acerca de ese 99%: trabajar con Generics and Reflection parece demasiado lucrativo, aunque muchas veces resulta ser un overkill/overcomplexation. –

16

Personalmente Me gusta mucho esta sintaxis.

Public Class Test(Of T As {New}) 
    Public Shared Function GetInstance() As T 
     Return New T 
    End Function 
End Class 

O si desea limitar los posibles tipos:

Public Class Test(Of T As {New, MyObjectBase}) 
    Public Shared Function GetInstance() As T 
     Return New T 
    End Function 
End Class 
+0

Sí, esto es mucho mejor –

Cuestiones relacionadas