2011-02-25 9 views
120

おそらく動的パターンを使用していますか?動的キーワードを使用して任意のメソッド/プロパティを呼び出すことができます。 myDynamicObject.DoStuff()を呼び出す前にメソッドが存在するかどうかをチェックする方法オブジェクトに特定のメソッド/プロパティがあるかどうかをチェックする方法は?

+0

そのケースを扱う* myDynamicObject *の種類は何ですか?それは 'DynamicObject'から派生したクラスですか? –

+0

動的キーワード –

答えて

180

方法のためである:

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

編集:あなたも拡張メソッドを実行すると、この

ようにそれを使用することができます
myObject.HasMethod("SomeMethod"); 
+0

GetType()は実行時の型を返しますか? (つまりオブジェクトではない) –

+2

はい、GetType()は実行中の型を返しますが、typeof()はobjectを返します。 – Julien

+1

ドキュメントによると、GetType()は "現在のインスタンスの正確な実行時の型"を返します。 – tzup

14

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

public interface IMyInterface 
{ 
    void Somemethod(); 
} 


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

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

あなたが指摘していることは、ダックタイピングです。オブジェクトがメソッドを持っていることをすでに知っているシナリオでは役に立ちますが、コンパイラはそれを確認できません。 これは、たとえばCOM interopシナリオで役に立ちます。 (thisの記事を参照)

ダックタイピングとリフレクションを組み合わせたい場合は、ダックタイピングの目標が不足していると思います。

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

同様の反射によって

+2

で宣言されたものは、オブジェクトが.NETフレームワークによって提供されるオブジェクトになる可能性があり、それを実装するために宣言できません。 –

+0

何が問題なのですか? .NET Frameworkによって提供されるオブジェクトのようなオブジェクトであるかどうかは、オブジェクトに「追加」メソッドがあるかどうかをチェックしたい場合など、 –

+0

と同じ方法でチェックできます。そして、オブジェクトがリスト、またはIEnumerableでない他のクラス –

64

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

+0

ニース。ループ内でGetMethodを実行して、適切な定義済みのプロパティを取得することもできます。 – Jnr

32

それは古い質問ですが、私はちょうどそれに遭遇しました。その名前を持つ複数のメソッドがある場合 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; 
    } 
} 
関連する問題