我正在寻找一种让通配符在.NET
泛型中工作的方法。
我的代码如下:
private class Rule<TSource, TSelected> where TSource : class where TSelected : class
{
// stuff in here
}
我希望能够创建一个相同但可能不同<>
的规则列表。TSource
TSelected
您需要创建一个逆变泛型接口 IRule<TSource, in TSelected>
并列出它,此外还将TSelected
被限制为一些有意义的类。约束到现有代码中的任何引用类型都将编译,但您将无法对与TSelected
.
目前没有其他方法可以使用变体泛型(当然,除非您进入反射模式List<dynamic>
或等效的东西),因此如果此解决方案不适合您,您将需要重新设计。
如果我没看错你的问题,我认为你必须这样做:
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
{
}
如果TSelected
类具有相同的超类,则只需列出Rule<TSource, TSelectedSuperClass>
. 我相信您可以在再次读取对象后使用 typeof ( http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx ) 来获取确切的子类。TSelected
或者,您可以创建一个容器类来包含两者并存储确切的类型。
接口可以代替超类来完成。但是,如果 Selected 共享实现,我更喜欢抽象类。