这是否可以用任何其他语法???
interface IFoo<T<U>> where U: Bar, new() where T<U>: class, IFoo<T<U>>, new()
这是一种强制IFoo的泛型参数为泛型类型的方法
class MyFoo<U>: IFoo<MyFoo<U>> where U: Bar, new()
编辑以说明一些观点:
List<U> GetList(int compareToCustomerProperty)
编辑以说明可用性:
interface IFoo<T<U>> where U: Bar, new() where T<U>: class, IFoo<T<U>>, new()
T<U> DoOnce();
class MyFoo<U>: IFoo<MyFoo<U>> where U: Bar, new()
MyFoo<U> DoOnce(){return this;}
MyFoo<U> DoAgain(){return this;}//this is not in interface
class Test{
public Test(){
IFoo<MyFoo<Bar>> x = new MyFoo<Bar>();//Generics can come as parameters
x.
DoOnce()//this is from interface
DoAgain();//Can access this x's method cause of generic in IFoo
}
}
我目前可以实现它,但我失去了通用的U。
可以没有它吗???共
我会在代码中的某些时候错过这种方法吗?全息!
我刚刚看到我在代码中看到这样很好(在抽象和具体之间进行链接,在泛型中有更多自由)
感谢您的回答!
答案 0 :(得分:1)
唯一接近我认为你想要做的事情是
public interface IBaz<U>
{
}
public class Baz<U> : IBaz<U>
{
}
public interface IFoo<T, U> where T : IBaz<U> where U: Bar, new()
{
}
public class Foo<U> : IFoo<Baz<U>, U>
where U: Bar, new()
{
}
答案 1 :(得分:1)
不,你不能在.Net框架中这样做。
看到将泛型类型参数限制为泛型本身没有多大意义。请考虑以下类型:
public class StringList : List<string> { }
StringList
和List<string>
几乎是同一类型。但是你可以写
Foo<List<string>>
而不是
Foo<StringList>
List<string>
已经从泛型类型定义List<>
创建的事实与大多数用法并不相关,除非您正在处理某种高反射导向行为。< / p>
我可以看到,例如,如果你想做这样的事情,你可能想要这种功能:
public interface GenericTypeConverter<T> where T : <>
{
T<V> Convert<U,V>(T<U> thing);
}
如果要创建一个Converter接口,声明要从T<U>
转换为T<V>
的函数,对于任何通用类型T
。但是,如果你从事复杂的代码生成/代码分析,我只能想象会发生这种情况。
如果是这种情况并且你真的需要它,你可以随时通过调用T
typeof(T).IsGenericType
是否是通用的