Wie kann ich eine generische Erweiterungsmethode definieren?

8

Ich versuche, eine Erweiterungsmethode zu definieren, die ein Objekt eines durch den Aufruf definierten Typs zurückgeben kann.

Gewünschte Verwendung: Cat acat = guy.GiveMeYourPet<Cat>();

Versuch der Implementierung

Ich habe keine Probleme generische Methoden wie folgt zu definieren:

%Vor%

oder Erweiterungsmethoden wie folgt:

%Vor%

Aber wenn ich versuche zu tun, was ich wirklich will:

%Vor%

Der Compiler erwartet, dass GiveMeYourPet () 2 Typargumente erhält (obwohl implizit ein Aufruf durch den Aufruf der Erweiterungsmethode für das Objekt guy erfolgt.

)

Was kann ich tun, damit dies funktioniert?

Beachten Sie, dass ich auch versucht habe, die Reihenfolge umzukehren, in der die Parameter definiert sind, aber nichts ändert sich:

%Vor%

Der folgende Aufruf funktioniert auch nicht, weil Sie keinen Methodenaufruf in der Typspezifikation haben können:

%Vor%     
Alain 15.07.2013, 22:09
quelle

4 Antworten

4

Die C # -Compiler-Typ-Inferenz ist nicht so anspruchsvoll, wie Sie vielleicht hoffen. Sie müssen beide Typen in einer solchen Methode explizit angeben:

%Vor%

Wenn Sie es vermeiden wollen, beide explizit anzugeben (und ich würde Sie nicht beschuldigen), könnten Sie versuchen, Ihre Methode in etwas wie:

zu ändern %Vor%

(mit dieser Schnittstelle sollten Sie nicht einmal wissen, was der echte Typ ist; wenn Sie dies tun, verwenden Sie as oder is ) Oder sogar:

%Vor%

(und as oder is verwenden)

Wenn das keine Option ist und der reale Typ von guy (in Ihrem Beispiel) nicht statisch bekannt ist (zB Sie haben ihn nur als object ), müssen Sie wahrscheinlich eine Reflektion verwenden, zB:

%Vor%     
Tim S. 15.07.2013, 22:14
quelle
1

Wenn etwas wie guy.GiveMeYour.Pet<Cat>(); funktionieren würde, könntest du zwei Level ähnlich dem Code erstellen:

%Vor%     
Alexei Levenkov 15.07.2013 22:20
quelle
1

Sie können generische Argumente nicht teilweise angeben, da sie alle abgeleitet sind oder Sie alle angeben müssen. In diesem Fall ist es am wahrscheinlichsten, dass Sie ein Zwischenobjekt zurückgeben, das den generischen Person -Typ enthält, an dem die Erweiterungsmethode aufgerufen wird, und definieren Sie Ihre Get -Methoden für diese:

%Vor%

, die Sie verwenden können wie:

%Vor%     
Lee 15.07.2013 22:21
quelle
0

Das geht leider nicht. Wenn der Compiler sie nicht alle herausfinden kann, müssen Sie alle Typargumente eingeben. Der C # -Compiler ist nicht das Smart. dynamic kann jedoch helfen:

%Vor%     
It'sNotALie. 15.07.2013 22:21
quelle

Tags und Links