有没有办法让下面的(不是编译的)代码运行起来?我还没有找到解决方案。
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);
.
它可以通过将方法 Get 定义为 Get 并在 V 上加上另一个约束来工作。但是调用将是 Factory.Get<A<B>,B>(....)
这不太好,因为 B 的声明有两次。
谢谢!
最佳答案
与 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);
}
}
关于C# 泛型方法,可以从泛型类型的类型定义中推断参数的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7176302/