Also hier ist, was ich versuche zu tun.
Ich erstelle eine generische Klasse, die den vom generischen Parameter angegebenen Typ auf eine von zwei Weisen zuweist, die durch den überladenen Konstruktor bestimmt wird.
Hier ist das Beispiel:
%Vor% Diese Klasse erfordert, dass Typ T in allen Fällen ein ref-Typ ist. Für den Standardkonstruktor möchten wir T über seinen Standardkonstruktor instanziieren. Ich möchte ein where T : new()
auf meinen Standardkonstruktor setzen, wie folgt:
Dies ist jedoch nicht gültig C #. Im Grunde möchte ich nur die Einschränkung für Typ T hinzufügen, um einen Standardkonstruktor nur zu haben, wenn der Standardkonstruktor von MyClass () verwendet wird.
Im zweiten Konstruktor für MyClass lassen wir den Benutzer bestimmen, wie er T mit einer eigenen Zuweisungsmethode zuordnen soll. Daher ist es offensichtlich sinnvoll, dass MyClass T nicht in allen Fällen als Standard-Konstrukt erzwingt.
Ich habe das Gefühl, dass ich dafür Reflektion im Standardkonstruktor verwenden muss, aber ich hoffe nicht.
Ich weiß, dass dies getan werden kann, weil die Klasse Lazy<T>
in .NET 4.0 nicht erfordert, dass T standardmäßig auf Klassenebene konstruierbar ist, aber es hat Konstruktoren, die denen in meinem Beispiel ähnlich sind. Ich würde gerne wissen, wie Lazy<T>
es zumindest tut.
Sie können in die Deklaration nur Einschränkungen einfügen, in denen Sie einen generischen Typparameter einführen
Sie könnten jedoch eine generische -Methode für einen nicht generischen -Typ einführen:
%Vor% (Ich würde persönlich nur Func<T>
verwenden, anstatt einen separaten Delegattyp btw zu deklarieren.)
Dann können Sie verwenden:
%Vor%Grundsätzlich möchte ich nur die Einschränkung für Typ T hinzufügen, um einen Standardkonstruktor nur zu haben, wenn der Standardkonstruktor von MyClass () verwendet wird.
Es ist nicht möglich, dies mit einer Einschränkung für T
zu erzwingen. Entweder ist where T : new()
in der Definition von MyClass<T>
angegeben oder Sie verzichten auf eine solche Einschränkung.
Ich habe das Gefühl, dass ich dafür Reflektion im Standardkonstruktor verwenden muss, aber ich hoffe nicht.
Sie können die Einschränkung nicht erzwingen, aber Sie können
sagen %Vor% ruft den Standardkonstruktor für T
auf.
Ich weiß, dass dies getan werden kann, weil die Lazy-Klasse in .NET 4.0 nicht erfordert, dass T auf Klassenebene standardmäßig konstruierbar ist, aber es hat Konstruktoren, die denen in meinem Beispiel ähnlich sind. Ich würde gerne wissen, wie Lazy es zumindest macht.
Lazy<T>
erfordert, dass Sie einen Delegaten angeben, der die Instanzen T
zurückgibt. Grundsätzlich müssen Sie eine Func<T>
angeben.