假设我有一个类似的接口(interface):
interface IAwesome
{
T DoSomething<T>();
}
有什么方法可以用类型约束来实现DoSomething方法吗?显然,这是行不通的:
class IncrediblyAwesome<T> : IAwesome where T : PonyFactoryFactoryFacade
{
public T DoSomething()
{
throw new NotImplementedException();
}
}
这显然是行不通的,因为此DoSomething()无法完全满足IAwesome的约定-它仅适用于类型参数T的所有可能值的子集。黑魔法”(如果答案是否定的,那我将做最后的选择)?
老实说,我认为这是不可能的,但我想知道你们的想法。
编辑:有问题的界面是 System.Linq.IQueryProvider ,因此我无法修改界面本身。
最佳答案
不,这在设计上是行不通的,因为这将意味着无法(完全)满足IAwesome
的契约(Contract)。
只要IncrediblyAwesome<T>
实现IAwesome
,就可以执行以下操作:
IAwesome x = new IncrediblyAwesome<Something>()
显然,由于您的附加约束,这无法正常工作,因为
IAwesome
的用户无法知道对其施加的限制。在您的情况下,我能想到的唯一解决方案是(进行运行时检查):
interface IAwesome { // assuming the same interface as in your sample
T DoSomething<T>();
}
class IncrediblyAwesome<TPony> : IAwesome where TPony : PonyFactoryFactoryFacade {
IAwesome.DoSomething<TAnything>() {
return (TAnything)((object)DoSomething()); // or another conversion, maybe using the Convert class
}
public TPony DoSomething() {
throw new NotImplementedException();
}
}