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%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:
(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:
Wenn etwas wie guy.GiveMeYour.Pet<Cat>();
funktionieren würde, könntest du zwei Level ähnlich dem Code erstellen:
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:
, die Sie verwenden können wie:
%Vor% 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:
Tags und Links c#