オブジェクトがC#で特定のインターフェイスを実装しているかどうかをテストする最も簡単な方法は何ですか?(Javaでのこの質問への回答 )
オブジェクトがC#で特定のインターフェイスを実装しているかどうかをテストする最も簡単な方法は何ですか?(Javaでのこの質問への回答 )
回答:
if (object is IBlah)
または
IBlah myTest = originalObject as IBlah
if (myTest != null)
if (object is IBlah iblah) { iblah.SomeMethod(); }
is
or as
演算子の使用は、コンパイル時にインターフェースのタイプがわかっていて、テストするタイプのインスタンスがある場合は正しい方法です。他の誰も言及していないように思われるものは次のとおりですType.IsAssignableFrom
:
if( typeof(IMyInterface).IsAssignableFrom(someOtherType) )
{
}
これはによって返される配列を調べるよりもはるかにきれいでGetInterfaces
、クラスでも機能するという利点があると思います。
typeof(IList).IsAssignableFrom(someType)
、なしでを使用し<>
ます。
インスタンスの場合:
if (obj is IMyInterface) {}
クラスの場合:
typeof(MyClass).GetInterfaces()
インターフェイスが含まれているかどうかを確認します。
チェック後に型キャストされたオブジェクトを使用する場合:
C#7.0以降:
if (obj is IMyInterface myObj)
これは同じです
IMyInterface myObj = obj as IMyInterface;
if (myObj != null)
.NETドキュメントを参照してください:#タイプパターンとのパターンマッチングis
"is"演算子を使用したテストに加えて、メソッドを装飾して、それに渡される変数が次のように特定のインターフェースを実装することを確認できます。
public static void BubbleSort<T>(ref IList<T> unsorted_list) where T : IComparable
{
//Some bubbly sorting
}
これが実装された.Netのバージョンがわからないため、お使いのバージョンでは機能しない可能性があります。
最近、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);
これはうまくいくはずです:
MyInstace.GetType().GetInterfaces();
でもいいね:
if (obj is IMyInterface)
または(あまりエレガントではありません):
if (obj.GetType() == typeof(IMyInterface))