带有'通配符'的C#泛型

时间:2013-06-10 13:14:19

标签: c# generics .net-4.5

我正在寻找一种让通配符在.NET泛型中工作的方法。

我的代码如下:

private class Rule<TSource, TSelected> where TSource : class where TSelected : class
{
    // stuff in here
}

我希望能够创建一个列表<>的规则,其中TSource将是相同的,但TSelected可能会有所不同。

3 个答案:

答案 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)来获取确切的子类。

或者,您可以使容器类包含两者,并存储确切的类型。

接口可以代替超类。但是,如果选择了共享实现,我更喜欢抽象类。