5

如果我有这个代码:

public interface IJobHelper
{
    List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : IFilterable;
}

有什么支持做这样的事情:

public interface IJobHelper
{
    List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : IFilterable or ISemiFilterable
}

所以它会接受任何支持两个接口之一的东西。我基本上是在尝试创建一个重载。

4

5 回答 5

3

据我所知,您可以使用AND逻辑而不是OR

AND(在这种情况下,T必须是IFilterable ISemiFilterable的子级)

public interface IJobHelper
{
    List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : IFilterable, ISemiFilterable
}
于 2013-04-22T03:54:01.020 回答
2

不,该语言不支持。

于 2013-04-22T03:33:41.363 回答
2

我想说的最简单的方法是,如果您的两个接口都是同一个父接口的子接口。

public interface IFilterable { }

public interface IFullyFilterable : IFilterable { }

public interface ISemiFilterable : IFilterable { }

... where T : IFilterable { }
于 2013-04-22T03:36:10.700 回答
2

该语言不支持在where子句中将接口/类“oring”在一起。

您需要使用不同的方法名称分别声明它们,以便签名不同。

public interface IJobHelper
{
    List<T> FilterwithinOrg<T>(IEnumerable<T> entities) 
        where T : IFilterable
    List<T> SemiFilterwithinOrg<T>(IEnumerable<T> entities) 
        where T : ISemiFilterable
}

或者,您可以在两个接口上实现一个通用接口。这与上面的内容不同,因为如果您需要一个不包含在IBaseFilterable.

public interface IBaseFilterable { }
public interface IFilterable : IBaseFilterable { }
public interface ISemiFilterable : IBaseFilterable { }

public interface IJobHelper
{
    List<T> FilterwithinOrg<T>(IEnumerable<T> entities)
        where T : IBaseFilterable
}

我不知道上下文,但上面可能是您正在寻找的内容。

于 2013-04-22T03:39:23.753 回答
0

您可以添加另一个空的基本接口,这两个接口都派生自...

 interface baseInterface {}
 interface IFilterable: baseInterface {}
 interface ISemiFilterable: baseInterface {}

然后要求泛型类型约束中的类型是基接口

 List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : baseInterface 

唯一的缺点是编译器不允许您在不强制转换的情况下使用来自任何派生接口的方法...

于 2013-04-22T03:38:36.110 回答