带有通配符'的c#泛型

本文关键字:泛型 通配符 | 更新日期: 2023-09-27 18:17:48

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

我的代码如下:
private class Rule<TSource, TSelected> where TSource : class where TSelected : class
{
    // stuff in here
}

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

带有通配符'的c#泛型

您需要制作一个逆变泛型接口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对象后获得确切的子类。

或者,您可以创建一个容器类来包含这两种类型,并存储确切的类型。

一个接口可以代替超类。然而,如果选择共享实现,我更喜欢一个抽象类。