オブジェクトがC#で特定のインターフェースを実装しているかどうかをテストする最も簡単な方法は何ですか? (この質問への回答 Javaでは )
if (object is IBlah)
または
IBlah myTest = originalObject as IBlah
if (myTest != null)
is
演算子またはas
演算子を使用することは、コンパイル時にインタフェースの型がわかっていて、テストしている型のインスタンスがある場合には正しい方法です。他に誰も言及していないようなものはType.IsAssignableFrom
です。
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
これはGetInterfaces
から返される配列を調べるよりもはるかに優れており、クラスに対しても機能するという利点があります。
例えば、
if (obj is IMyInterface) {}
クラスの場合:
typeof(MyClass).GetInterfaces()
にインターフェースが含まれているかどうかを確認してください。
@ AndrewKennanの答えのバリエーションで、実行時に取得した型に最近使用しました。
if (serviceType.IsInstanceOfType(service))
{
// 'service' does implement the 'serviceType' type
}
チェックの後に型キャストされたオブジェクトを使いたい場合は、
C#7.0以降:
if (obj is IMyInterface myObj)
これはと同じです
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
.NETドキュメントを参照してください。 is
#型パターンとのパターンマッチング
これ Post は良い答えです。
public interface IMyInterface {}
public class MyType : IMyInterface {}
これは簡単な例です。
typeof(IMyInterface).IsAssignableFrom(typeof(MyType))
または
typeof(MyType).GetInterfaces().Contains(typeof(IMyInterface))
"is"演算子を使用したテストに加えて、メソッドに装飾を加えることで、渡された変数が特定のインターフェイスを実装していることを確認できます。
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
.Netのどのバージョンがこれで実装されたのかわからないので、あなたのバージョンではうまくいかないかもしれません。
私にとってうまくいったのは:
Assert.IsNotNull(typeof (YourClass).GetInterfaces().SingleOrDefault(i => i == typeof (ISomeInterface)));
最近私はAndrew Kennanの答えを使用してみましたが、それは何らかの理由でうまくいきませんでした。私は代わりにこれを使用しました、そして、それは働きました(注:名前空間を書くことは必要とされるかもしれません)。
if (typeof(someObject).GetInterface("MyNamespace.IMyInterface") != 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);
私が使った
Assert.IsTrue(myObject is ImyInterface);
myObjectが私のインターフェースImyInterfaceを実装したオブジェクトであることをテストする私のユニットテストのテストのために。