C# 在C中,你能把Or放在“中”吗;其中;接口约束?

C# 在C中,你能把Or放在“中”吗;其中;接口约束?,c#,generics,interface,C#,Generics,Interface,如果我有此代码: public interface IJobHelper { List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : IFilterable; } 公共接口IJobHelper { 列出FilterwithinOrg(IEnumerable实体),其中T:IFilterable; } 是否有任何东西支持这样做: public interface IJobHelper

如果我有此代码:

public interface IJobHelper
{
    List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : IFilterable;
}
公共接口IJobHelper
{
列出FilterwithinOrg(IEnumerable实体),其中T:IFilterable;
}
是否有任何东西支持这样做:

public interface IJobHelper
{
    List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : IFilterable or ISemiFilterable
}
公共接口IJobHelper
{
列出FilterwithinOrg(IEnumerable实体),其中T:IFilterable或iMiFilterable
}

因此,它将接受支持两个接口之一的任何东西。我基本上是想制造一个过载

不,该语言不支持这一点。

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

public interface IFilterable { }

public interface IFullyFilterable : IFilterable { }

public interface ISemiFilterable : IFilterable { }

... where T : IFilterable { }

您只需添加另一个空的基本接口,这两个接口都是从中派生的

 interface baseInterface {}
 interface IFilterable: baseInterface {}
 interface ISemiFilterable: baseInterface {}
然后要求泛型类型约束中的类型是基接口

 List<T> FilterwithinOrg<T>(IEnumerable<T> entities) where T : baseInterface 
列出FilterwithinOrg(IEnumerable实体),其中T:baseInterface

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

该语言不支持在
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
}

我不知道上下文,但上面的内容可能就是您想要的。

据我所知,您可以使用AND逻辑,也可以不使用AND逻辑

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

公共接口IJobHelper
{
列出FilterwithinOrg(IEnumerable实体),其中T:IFilterable,iMiFilterable
}

为什么不创建一个通用的可过滤类,然后用更具体的可过滤类继承该类呢。然后,您可以将where子句与通用filterable类一起使用,并将其约束到多个类。我尝试了第一件事,在具有不同where约束的接口中列出了它两次,但得到了“已声明相同的方法”错误。有什么想法吗?啊,是的,我会找到答案的。你需要给他们不同的名字,这不是逻辑。如果你有一个类是ISEMIFILTRABLE的子类,那么这意味着这个类也是ISEMIFERTRABLE的子类。@VanoMaisuradze是吗?结果是一样的?哪个结果?你写的,不是或是。它是AND@VanoMaisuradze当然不是!如果
T
isemfilterable
,则它不是
IFullyFilterable
。所以,这不是一个和。
public interface IBaseFilterable { }
public interface IFilterable : IBaseFilterable { }
public interface ISemiFilterable : IBaseFilterable { }

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