16


1

Type.GetMethods()によって返された自動生成されたメソッド(getter / setter / add / remove / .etc)を除外する

`Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)`を使用して、特定のタイプのメソッドの配列を取得します。

問題は、返された `MethodInfo`に、コンパイラーによって生成されたメソッドが含まれている可能性があることです。 例えば:

  • プロパティ bool Enabled {get; } `は bool get_Enabled() `を取得します

  • イベント「SomethingChanged」は「add_SomethingChanged(EventHandler)」を取得します および remove_SomethingChanged(EventHandler)

おそらく非常に複雑になる可能性のあるフィルターロジックを追加して、それらを取り除くことができます。 ユーザー定義のメソッドのみを取得するために、「BindingFlags」設定など、他にできることがあるかどうかを知りたいですか?

3 Answer


26


typeof(MyType)
    .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
    .Where(m => !m.IsSpecialName)


2


最善の策は、http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.compilergeneratedattribute.aspx [CompilerGenerated]属性を持つメソッドを除外することです。 これは将来の可能性が高いと思われますが、この属性を完全に軽視している将来の仮想コンパイラを説明するものではありません。 IsSpecialName`テストは、おそらくC#コンパイラがイベントの add`メソッドと `remove`メソッドに属性を付加しないように見えるため、必要です。


-2


秘密はBindingFlags。* DeclaredOnly *です

typeof(MyType).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)