web-dev-qa-db-ja.com

オブジェクトに特定のメソッド/プロパティがあるかどうかを確認する方法は?

おそらく動的パターンを使用していますか? dynamicキーワードを使用して、任意のメソッド/プロパティを呼び出すことができますよね?たとえば、myDynamicObject.DoStuff()を呼び出す前にメソッドが存在するかどうかを確認する方法は?

144
Louis Rhys

あなたはそのような何かを書くことができます:

public static bool HasMethod(this object objectToCheck, string methodName)
{
    var type = objectToCheck.GetType();
    return type.GetMethod(methodName) != null;
} 

編集:拡張メソッドを実行して、次のように使用することもできます

myObject.HasMethod("SomeMethod");
210
Julien

リフレクション経由

 var property = object.GetType().GetProperty("YourProperty")
 property.SetValue(object,some_value,null);

メソッドも同様です

77
Stecya

それは古い質問ですが、私はそれに出くわしました。 Type.GetMethod(string name)は、その名前のメソッドが複数ある場合、AmbiguousMatchExceptionをスローします。

public static bool HasMethod(this object objectToCheck, string methodName)
{
    try
    {
        var type = objectToCheck.GetType();
        return type.GetMethod(methodName) != null;
    }
    catch(AmbiguousMatchException)
    {
        // ambiguous means there is more than one result,
        // which means: a method with that name does exist
        return true;
    }
} 
41
esskar

これには動的型を使用せずに、クラスにインターフェースを実装させる方が良いでしょう。次に、実行時にオブジェクトがそのインターフェイスを実装しているかどうか、したがって、期待されるメソッド(またはプロパティ)を持っているかどうかを確認できます。

public interface IMyInterface
{
   void Somemethod();
}


IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
   x.Somemethod();
}

これが唯一の正しい方法だと思います。

参照しているのはアヒルのタイピングです。これは、オブジェクトにメソッドがあることを既に知っているが、コンパイラがそれをチェックできないシナリオで役立ちます。これは、たとえばCOM相互運用シナリオで役立ちます。 (チェック this 記事)

たとえば、ダックタイピングとリフレクションを組み合わせたい場合、アヒルタイピングの目標を見逃していると思います。

16