过滤掉Type.GetMethods()返回的自动生成的方法(getter / setter / add / remove / .etc)

我使用Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)来检索给定类型的方法数组。

问题是返回的MethodInfo可能包含由我不想要的编译器生成的方法。 例如:

  • property bool Enabled { get; } 将得到bool get_Enabled()

  • 事件SomethingChanged将获得add_SomethingChanged(EventHandler)remove_SomethingChanged(EventHandler)

我可以添加一些filter逻辑来摆脱它们,这可能会变得非常复杂。 我想知道是否还有其他我可以做的事情,例如使用BindingFlags设置,只检索用户定义的方法?

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

我认为最好的办法是过滤掉具有CompilerGenerated属性的方法。 这可能更具有前瞻性,尽管这并不能解释假设的未来编译器完全不尊重这一属性。 可能需要IsSpecialName测试,因为它看起来好像C#编译器没有将属性附加到事件addremove方法。

秘密是BindingFlags。 DeclaredOnly

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