おそらく動的パターンを使用していますか? dynamicキーワードを使用して、任意のメソッド/プロパティを呼び出すことができますよね?たとえば、myDynamicObject.DoStuff()を呼び出す前にメソッドが存在するかどうかを確認する方法は?
あなたはそのような何かを書くことができます:
public static bool HasMethod(this object objectToCheck, string methodName)
{
var type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
編集:拡張メソッドを実行して、次のように使用することもできます
myObject.HasMethod("SomeMethod");
リフレクション経由
var property = object.GetType().GetProperty("YourProperty")
property.SetValue(object,some_value,null);
メソッドも同様です
それは古い質問ですが、私はそれに出くわしました。 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;
}
}
これには動的型を使用せずに、クラスにインターフェースを実装させる方が良いでしょう。次に、実行時にオブジェクトがそのインターフェイスを実装しているかどうか、したがって、期待されるメソッド(またはプロパティ)を持っているかどうかを確認できます。
public interface IMyInterface
{
void Somemethod();
}
IMyInterface x = anyObject as IMyInterface;
if( x != null )
{
x.Somemethod();
}
これが唯一の正しい方法だと思います。
参照しているのはアヒルのタイピングです。これは、オブジェクトにメソッドがあることを既に知っているが、コンパイラがそれをチェックできないシナリオで役立ちます。これは、たとえばCOM相互運用シナリオで役立ちます。 (チェック this 記事)
たとえば、ダックタイピングとリフレクションを組み合わせたい場合、アヒルタイピングの目標を見逃していると思います。