具有泛型类型参数的Net泛型类型

时间:2012-03-07 02:15:32

标签: c# .net generics

这是否可以用任何其他语法???

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()

编辑以说明一些观点:

  • U是Bar ...它将是一个客户实体
  • T是IFoo ...它将是一个客户业务对象
  • IFoo是某些业务对象的接口
  • IFoo定义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。

可以没有它吗???共
我会在代码中的某些时候错过这种方法吗?全息!

我刚刚看到我在代码中看到这样很好(在抽象和具体之间进行链接,在泛型中有更多自由)

感谢您的回答!

2 个答案:

答案 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> { }

StringListList<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是否是通用的