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

时间:2010-09-07 18:31:30

标签: c# events reflection properties getmethod

我使用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 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:2)

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

答案 2 :(得分:-2)

秘密是BindingFlags。 DeclaredOnly

unwanted_words = ['hello', 'random']
samp_data = samp_data[~samp_data.b.str.contains('|'.join(unwanted_words))]