1

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

我的代码如下:

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

我希望能够创建一个相同但可能不同<>的规则列表。TSourceTSelected

4

3 回答 3

1

您需要创建一个逆变泛型接口 IRule<TSource, in TSelected>并列出它,此外还将TSelected被限制为一些有意义的类。约束到现有代码中的任何引用类型都将编译,但您将无法对与TSelected.

目前没有其他方法可以使用变体泛型(当然,除非您进入反射模式List<dynamic>或等效的东西),因此如果此解决方案不适合您,您将需要重新设计。

于 2013-06-10T13:17:31.900 回答
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
{
}
于 2013-06-10T13:21:30.047 回答
0

如果TSelected类具有相同的超类,则只需列出Rule<TSource, TSelectedSuperClass>. 我相信您可以在再次读取对象后使用 typeof ( http://msdn.microsoft.com/en-us/library/58918ffs(v=vs.71).aspx ) 来获取确切的子类。TSelected

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

接口可以代替超类来完成。但是,如果 Selected 共享实现,我更喜欢抽象类。

于 2013-06-10T13:26:12.480 回答