web-dev-qa-db-ja.com

オブジェクトがインターフェースを実装しているかテストする

オブジェクトがC#で特定のインターフェースを実装しているかどうかをテストする最も簡単な方法は何ですか? (この質問への回答 Javaでは

319
JoshRivers
if (object is IBlah)

または

IBlah myTest = originalObject as IBlah

if (myTest != null)
522
Robert C. Barth

is演算子またはas演算子を使用することは、コンパイル時にインタフェースの型がわかっていて、テストしている型のインスタンスがある場合には正しい方法です。他に誰も言及していないようなものはType.IsAssignableFromです。

if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}

これはGetInterfacesから返される配列を調べるよりもはるかに優れており、クラスに対しても機能するという利点があります。

209
Andrew Kennan

例えば、

if (obj is IMyInterface) {}

クラスの場合:

typeof(MyClass).GetInterfaces()にインターフェースが含まれているかどうかを確認してください。

19
Rauhotz

@ AndrewKennanの答えのバリエーションで、実行時に取得した型に最近使用しました。

if (serviceType.IsInstanceOfType(service))
{
    // 'service' does implement the 'serviceType' type
}
15
famousgarkin

チェックの後に型キャストされたオブジェクトを使いたい場合は、
C#7.0以降:

if (obj is IMyInterface myObj)

これはと同じです

IMyInterface myObj = obj as IMyInterface;
if (myObj != null)

.NETドキュメントを参照してください。 is#型パターンとのパターンマッチング

7
MA-Maddin

これ Post は良い答えです。

public interface IMyInterface {}

public class MyType : IMyInterface {}

これは簡単な例です。

typeof(IMyInterface).IsAssignableFrom(typeof(MyType))

または

typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
3
eliasetm

"is"演算子を使用したテストに加えて、メソッドに装飾を加えることで、渡された変数が特定のインターフェイスを実装していることを確認できます。

public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
     //Some bubbly sorting
}

.Netのどのバージョンがこれで実装されたのかわからないので、あなたのバージョンではうまくいかないかもしれません。

3
jamesmillerio

私にとってうまくいったのは:

Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));

2
Dutchman078

最近私はAndrew Kennanの答えを使用してみましたが、それは何らかの理由でうまくいきませんでした。私は代わりにこれを使用しました、そして、それは働きました(注:名前空間を書くことは必要とされるかもしれません)。

if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != null)
1
jahu

メソッドに変数を渡していて、それがインターフェースなのかオブジェクトなのかわからないという状況がありました。

目標は次のとおりです。

  1. Itemがインタフェースの場合、そのインタフェースに基づいてオブジェクトをインスタンス化し、そのインタフェースはコンストラクタ呼び出しのパラメータになります。
  2. 項目がオブジェクトの場合は、呼び出し用のコンストラクタがインターフェイスを期待していて、コードを無効にしたくないので、nullを返します。

私は次のことでこれを達成しました:

    if(!typeof(T).IsClass)
    {
       // If your constructor needs arguments...
       object[] args = new object[] { my_constructor_param };
       return (T)Activator.CreateInstance(typeof(T), args, null);
    }
    else
       return default(T);
0
Anthony Tristan

私が使った

Assert.IsTrue(myObject is ImyInterface);

myObjectが私のインターフェースImyInterfaceを実装したオブジェクトであることをテストする私のユニットテストのテストのために。

0
iamrcw