【发布时间】:2013-07-16 06:40:11
【问题描述】:
我正在尝试定义一个扩展方法,该方法可以返回调用定义的类型的对象。
预期用途: Cat acat = guy.GiveMeYourPet<Cat>();
尝试实施
我可以毫不费力地定义这样的泛型方法:
public static T GiveMeYourPet<T>(Person a) { ... }
Cat acat = GiveMeYourPet<Cat>(guy);
或像这样的扩展方法:
public static Cat GiveMeYourPetCat<P>(this P self) where P : Person, ... { ... }
Cat acat = guy.GiveMeYourPetCat();
但是当我尝试做我真正想做的事时:
public static T GiveMeYourPet<T, P>(this P self) where P : Person, ... { ... }
Cat acat = guy.GiveMeYourPet<Cat>();
编译器期望 GiveMeYourPet() 接收 2 个类型参数(即使一个是通过调用对象 guy 的扩展方法隐式提供的。
我能做些什么来完成这项工作?
请注意,我还尝试颠倒定义参数的顺序,但没有任何变化:
public static T GiveMeYourPet<P, T>(this P self)
以下调用也不起作用,因为您不能在类型规范中进行方法调用:
Cat acat = guy.GiveMeYourPet<guy.GetType(), Cat>();
【问题讨论】:
-
我认为您需要将 T 作为参数显式传递 - 否则编译器将如何知道要输入什么返回?
-
您不能只使某些参数隐式。要么全无。
-
我认为扩展方法不适用于泛型
this类型;第一个解决方案应该可以工作。 -
你会在这种方法的实现中投入什么?我认为最好将其拆分为 2 个单独的 1-type 参数化方法。
标签: c#