2011-12-27 14 views
1

可能性の重複:
Determine if Equals() is an override?メソッドが型内でオーバーライドされているかどうかをチェックする方法は?リフレクションC#

私は、特定のタイプがObject.Equalsかをオーバーライドするかどうかのためにコードの特定の部分を実行する必要があります。

タイプがこのメソッドをオーバーライドするかどうかを確認するにはどうすればよいですか?

VSのtypeof(mytype).GetMethod("Equals").と入力すると、さまざまなオプションが表示されますが、「IsOverriden」などはありません。

+1

多態性のポイントは、クラスが 'Equals'のようなメソッドをオーバーライドするかどうか気にする必要がないということです。そうであれば、正しいことをすることを信頼します。さらにケアするために、においがする。 – cHao

+0

*型がメソッドをオーバーライドするかどうか、またはその基本クラスのいずれかがオーバーライドされているかどうかを知りたいですか? – Gabe

+0

@cHao彼は、カスタムEqualsを実装する必要がある型に対してリフレクションを使用するフレームワークを作成することができます。それはWPFで一般的です。 –

答えて

0

あなたはあなたの利点に結合フラグを使用することができます。

var t = typeof(mytype).GetMethod(
      "Equals", 
      BindingFlags.Public | 
      BindingFlags.Instance | 
      BindingFlags.DeclaredOnly 
     ); 

その後tがあればnullではなく、場合にのみmytype上書きEquals

+3

あなたのコードは 'string'や他の大部分の型に対しては機能しません。これらの型は' Equals'をオーバーロードするので、 'AmbiguousMatchException'にヒットするためequalsをオーバーライドします。そして、メソッドを隠すこともしません。実際に働く方法のために複製のAniの答えを確認してください。 – CodesInChaos

1

​​がtypeof(object)であることを確認してください。

+0

ええ、基本的に、GetMethodによって返されたMethodInfoオブジェクトのDeclaringTypeを確認してください。 –

+0

これは1ビットには役立ちません。オブジェクトはデフォルトではEquals()を持ちますが、オーバーライドされているかどうかはわかりません。 –

+0

instance.GetType()。GetMethod( 'MethodName')。DeclaringTypeが役立つはず、はい –

1

最初にMethodInfoクラスには​​があり、それがSystem.Objectであるかどうかを確認するには2通りの方法があります。次に、列挙型を受け入れるGetMethodのオーバーロードを使用して、DeclaredOnlyを渡して、親オブジェクトを取得しないようにすることができます。

関連する問題