C#泛型方法,可以推断泛型类型定义中参数的类型吗?

时间:2011-08-24 13:33:55

标签: c# .net generics

有没有办法让以下(不编译)代码运行?我还没有找到解决方案。

public class Factory{
    public static T Get<T>(V v)
        where T : BaseClass<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}

T是普通的泛型类型参数,用于定义泛型方法“Get”,但是具有包含泛型本身的类型约束。 现在,该方法应该定义一个参数,其类型由方法的泛型类型参数定义的泛型类型参数定义 BaseClass将定义一个方法Set接收其泛型类型参数类型的参数 这意味着应该可以调用Factory.Get<A<B>>(someObjectCastableToB);

通过在V上使用另一个约束来定义Get as Get方法,但是调用将是Factory.Get<A<B>,B>(....),这不是那么好,因为B的声明有两次。

谢谢!

1 个答案:

答案 0 :(得分:2)

与C ++模板不同,在C ++模板中,您可以拥有"template templates""partial specialization",C#泛型参数只能在声明站点上进行一次深入,而泛型约束只能告诉您有关血统的信息,而不是其他内容。如果你想能够引用你的一个泛型参数的泛型参数,那么唯一的方法就是在你的例子中,通过对继承沿袭的通用约束(T : BaseClass<V>)和那么V也必须在通用签名中识别。你需要类似下面的内容。

public class Factory{
    public static T Get<T, V>(V v)
        where T : BaseClass<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}

我在这里添加的是您的方法签名的通用参数V.同样,如果您没有基类来锚定V,那么您将无法对您的情况做很多事情。例如,如果T本身的运行时类型是通用的,而不是它的基类,那么您将被卡住,如下面的示例所示,编译。

public class Factory{
    public static T Get<T, V>(V v)
        where T : T<V> {
            T someObject = DIContainer.Resolve<T>();
            someObject.Set(v);
    }
}