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

带有'的C#泛型;通配符';,c#,generics,.net-4.5,C#,Generics,.net 4.5,我正在寻找一种让通配符在.NET泛型中工作的方法 我的代码如下: private class Rule<TSource, TSelected> where TSource : class where TSelected : class { // stuff in here } 私有类规则,其中TSource:class其中TSelected:class { //这里的东西 } 我希望能够创建一个规则列表,,其中t源将是相同的,但所选的t可能不同。您需要创建一个IRule并

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

我的代码如下:

private class Rule<TSource, TSelected> where TSource : class where TSelected : class
{
    // stuff in here
}
私有类规则,其中TSource:class其中TSelected:class
{
//这里的东西
}
我希望能够创建一个规则列表,
,其中
t源
将是相同的,但所选的
t可能不同。

您需要创建一个
IRule
并创建一个规则列表,此外,
t所选的
将被约束到某个有意义的类。约束到现有代码中的任何引用类型都会编译,但是对于与
TSelected
相关的任何操作,您将无法执行任何有意义的操作

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

您需要制作一个
IRule
,并制作一个列表,此外,
t选中的
将被约束到某个有意义的类。约束到现有代码中的任何引用类型都会编译,但是对于与
TSelected
相关的任何操作,您将无法执行任何有意义的操作


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

如果我读对了您的问题,我认为您必须这样做:

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
{
}
已选择公共接口
{
//选定接口
}
//经过选择的实现
公共类实现1:ISelected{}
//另一个
公共类实现2:ISelected{}
//我们的规则
私有类规则where TSource:class where TSelected is elected
{
}

如果我没看错你的问题,我想你必须这样做:

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
{
}
已选择公共接口
{
//选定接口
}
//经过选择的实现
公共类实现1:ISelected{}
//另一个
公共类实现2:ISelected{}
//我们的规则
私有类规则where TSource:class where TSelected is elected
{
}

如果所选的
t类具有相同的超类,则您只需列出
规则
。我相信在再次阅读
TSelected
对象之后,您可以使用typeof()获得确切的子类

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


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

如果所选的
类具有相同的超类,您只需列出
规则。我相信在再次阅读
TSelected
对象之后,您可以使用typeof()获得确切的子类

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


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

哪里的TSource与什么相同?你能说得更准确些吗?
列表中的内容是什么?
?答案可能是可能的,这取决于“这里的东西”部分。具体来说,查看所有方法签名非常重要。TSource在哪里与什么相同?你能说得更准确些吗?
列表中的内容是什么?
?答案可能是可能的,这取决于“这里的东西”部分。具体地说,查看所有方法签名将非常重要。
t选择的
不太可能在
中用
修饰:
规则
需要返回一些内容,
t源
看起来不像是合适的候选者(至少从其名称来看)。在
中,
t选择的
不太可能被
中的
修饰:
规则
需要返回一些内容,而且
t源
看起来不像是合适的候选项(至少从其名称判断)。不过,我同意其他意见,即不清楚你正试图用这些规则做什么。不过,我同意其他意见,即不清楚你正试图用这些规则做什么。