我正在寻找一种让通配符在.NET
泛型中工作的方法。
我的代码如下:
private class Rule<TSource, TSelected> where TSource : class where TSelected : class
{
// stuff in here
}
我希望能够创建一个列表<>
的规则,其中TSource
将是相同的,但TSelected
可能会有所不同。
答案 0 :(得分:1)
您需要制作一个contravariant generic interface IRule<TSource, in TSelected>
并列出一个列表,其中TSelected
将被限制为某个有意义的类。对现有代码中的任何引用类型进行约束将进行编译,但是对于与TSelected
有关的任何事情,您将无法做任何有意义的事情。
此时没有其他方法可以使用变体泛型(当然,除非您使用List<dynamic>
或类似的东西进入反射模式),因此如果此解决方案不适合您,则需要重新设计。
答案 1 :(得分:0)
如果我正确地读了你的问题,我认为你必须这样做:
public interface ISelected
{
// ISelected interface
}
// A TSelected implementation
public class Implementation1: ISelected { }
// Another
public class Implementation2 : ISelected { }
// our Rule
private class Rule<TSource, TSelected> where TSource : class where TSelected ISelected
{
}
答案 2 :(得分:0)
如果TSelected
类具有相同的超类,则可以只列出Rule<TSource, TSelectedSuperClass>
。我相信你可以在再次阅读TSelected
对象后使用typeof(http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx)来获取确切的子类。
或者,您可以使容器类包含两者,并存储确切的类型。
接口可以代替超类。但是,如果选择了共享实现,我更喜欢抽象类。