Erstellen Sie eine neue Instanz von T ohne die neue Einschränkung

8

Wenn Sie eine neue Instanz eines Generics erstellen möchten, müssen Sie die neue Einschränkung anwenden wie folgt definiert werden:

%Vor%

Ist es möglich, unter Verwendung der Reflexion eine Instanz von T ohne die neue Einschränkung zu erzeugen, so (enthält Pseudocode):

%Vor%     
davenewza 26.06.2013, 06:43
quelle

2 Antworten

13

Benutze Activator.CreateInstance() dafür. Weitere Informationen zur Verwendung dieser Methode finden Sie Ссылка . Was Sie tun ist im Grunde:

%Vor%

Sie können überprüfen, ob ein Standardkonstruktor vorhanden ist, indem Sie die Methode GetConstructors() verwenden:

%Vor%

Wenn Sie einen Konstruktor mit Nullparametern finden, können Sie die Methode Activator.CreateInstance verwenden. Andernfalls verwenden Sie die Methode Factory<T>.CreateNew() .

BEARBEITEN:

Um direkt herauszufinden, ob ein Konstruktor ohne Parameter existiert, können Sie die folgende Kontrolle verwenden:

%Vor%     
Pieter van Ginkel 26.06.2013, 06:47
quelle
7

Generische Methoden mit einer where T : new() Einschränkung implementieren new T() Aufrufe durch Aufruf von Activator.CreateInstance<T>() . Eine interessante Sache bei dieser Methode ist, dass die Einschränkung nicht enthält. Wenn Sie also die Überprüfung bis zur Laufzeit verschieben möchten, verwenden Sie einfach:

%Vor%

was entweder genau das tut, was return new T() getan hätte oder eine sinnvolle Ausnahme auslösen würde. Da es sowohl den Erfolgs- als auch den Fehlerfall behandelt, gibt es keinen wirklichen Vorteil bei zusätzlichen Prüfungen, es sei denn, Sie wollten etwas unklares tun, wie gar keinen Konstruktor verwenden (was möglich ist).

    
Marc Gravell 26.06.2013 06:55
quelle