在C#中,你可以将Or放在“where”接口约束中吗?

时间:2013-04-22 03:32:44

标签: c# generics interface

如果我有这个代码:

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
}

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

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

不,语言不支持。

答案 2 :(得分:2)

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

public interface IFilterable { }

public interface IFullyFilterable : IFilterable { }

public interface ISemiFilterable : IFilterable { }

... where T : IFilterable { }

答案 3 :(得分: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
}

我不知道上下文,但上面可能就是你要找的。

答案 4 :(得分:0)

您可以添加另一个空基接口,这两个接口都来自...

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

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

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

唯一的缺点是编译器不允许您使用任何派生接口的方法而不进行转换...