2010-03-07 14 views
6

ich nach einer Antwort gesucht haben und einige C# -examples gefunden, konnte aber nicht bekommen dies in vb.net läuft:eine neue Instanz eines Typs gegeben als Parameter

Ich dachte an etwas wie folgt aus:

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 

ich weiß, kann ich eine neue Instanz mit dem Activator.Create schaffen ... Methoden, aber wie ein Array dieser Art zu schaffen, oder einfach nur eine neue Variable deklarieren? (dim)

Vielen Dank im Voraus!

Antwort

14

Es hängt wirklich vom Typ selbst ab. Wenn der Typ ein Referenztyp ist und einen leeren Konstruktor (a Konstruktor Annahme Null Argumente), sollte der folgende Code eine insance davon erstellen: Verwendung 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 

Typparameter Verwendung:

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

@ M. A. Hanins Antwort ist großartig, verwende definitiv die generische Version, wenn du kannst. Anstelle von .Invoke (New Object()) denke ich, dass Sie. Invoke (Nothing) verwenden müssen. All das sagte, 99% der Fälle, in denen ich sehe, dass jemand das tut, tun sie es aus dem falschen Grund oder machen etwas wirklich sehr, sehr schwer. Reflektion ist in einer Handvoll Situationen nützlich, aber meistens macht es Ihren Code viel verwirrender. –

+0

Diese Antwort ist genau das, was ich brauchte! Ich versuche immer noch http://StackOverflow.com/Questions/2386690/method-to-override-shared-members-in-child-Classes/2387070 arbeiten, so scheint dies eine Lösung zu sein. – stex

+0

@Stex, froh, dass ich helfen konnte. Was diese andere Frage betrifft, habe ich eine andere Lösung vorgeschlagen, aber jetzt sehe ich, dass sie irrelevant sein könnte. @Chris Haas, danke für Ihren Kommentar. Ich denke, mit diesen 99% hast du Recht - die Arbeit mit Generics und Reflection scheint einfach zu lukrativ, obwohl es sich oft als Overkill/Overcomplexation herausstellt. –

16

Persönlich mag ich diese Syntax viel mehr.

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

Oder wenn Sie die möglichen Typen zu begrenzen:

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

Yup, das ist viel besser –

Verwandte Themen