[英]C# generic methods, possible to infer type for parameters from generic type's type definition?
有什么方法可以使以下(未编译)代码运行? 我还没有找到解决方案。
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 as Get定义为V并在V上施加另一个约束将可以工作。但是随后的调用将是Factory.Get<A<B>,B>(....)
,因为B的声明不是那么好有两次。
谢谢!
与C ++模板(可以具有“模板模板”或“部分专业化”)不同 ,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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.