Sto tentando di definire un metodo di estensione che può restituire un oggetto di un tipo definito dalla chiamata.Come definire un metodo di estensione generico
Uso desiderata:Cat acat = guy.GiveMeYourPet<Cat>();
Tentativo implementazione
non ho problemi a definire metodi generici come questo:
public static T GiveMeYourPet<T>(Person a) { ... }
Cat acat = GiveMeYourPet<Cat>(guy);
o estensione metodi come questo:
public static Cat GiveMeYourPetCat<P>(this P self) where P : Person, ... { ... }
Cat acat = guy.GiveMeYourPetCat();
Ma quando cerco di fare quello che voglio:
public static T GiveMeYourPet<T, P>(this P self) where P : Person, ... { ... }
Cat acat = guy.GiveMeYourPet<Cat>();
Il compilatore si aspetta GiveMeYourPet() per ricevere 2 argomenti di tipo (anche se uno è implicita chiamando il metodo di estensione sull'oggetto guy
.
Cosa posso fare per fare in modo che funzioni?
Nota che ho provato anche invertendo l'ordine in cui sono definiti i parametri, ma non cambia nulla:
public static T GiveMeYourPet<P, T>(this P self)
la seguente chiamata, inoltre, non funziona, perché non si può avere una chiamata di metodo nel tipo specifiation:
Cat acat = guy.GiveMeYourPet<guy.GetType(), Cat>();
Sto pensando che avresti bisogno di passare a T in modo esplicito come parametro - altrimenti come sarà il compilatore sa cosa tipo di tornare? – Tim
Non è possibile rendere impliciti solo alcuni parametri. È tutto o nessuno. – Andre
Non penso che i metodi di estensione funzionino con un tipo generico 'this'; la prima soluzione dovrebbe funzionare comunque. – poke