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
}

そのため、2 つのインターフェイスのいずれかをサポートするものはすべて受け入れます。私は基本的にオーバーロードを作成しようとしています。

4

5 に答える 5

2

whereこの言語は、句内のインターフェイス/クラスの「論理和」をサポートしていません。

署名が異なるように、異なるメソッド名でそれらを別々に記述する必要があります。

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 に答える
2

私が言う簡単な方法は、両方のインターフェースが同じ親インターフェースの子である場合です。

public interface IFilterable { }

public interface IFullyFilterable : IFilterable { }

public interface ISemiFilterable : IFilterable { }

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

いいえ、言語はそれをサポートしていません。

于 2013-04-22T03:33:41.363 に答える
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 に答える