【问题标题】:Filtering out auto-generated methods (getter/setter/add/remove/.etc) returned by Type.GetMethods()过滤掉由 Type.GetMethods() 返回的自动生成的方法(getter/setter/add/remove/.etc)
【发布时间】:2011-04-09 08:37:37
【问题描述】:

我使用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 设置,仅检索用户定义的方法?

【问题讨论】:

标签: c# events reflection properties getmethod


【解决方案1】:
typeof(MyType)
    .GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
    .Where(m => !m.IsSpecialName)

【讨论】:

  • 我没有考虑并发性,但是是什么让同时使用两者变得危险?谷歌搜索时,我确实看到一些较早的论坛帖子说 IsSpecialName 在某些情况下不可靠,但由于他们是在 .NET 1.0 的上下文中谈论它,所以我只是假设这个问题在 3.5 之前或 3.5 中得到了解决。
【解决方案2】:

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

【讨论】:

  • 您可以使用Where(m => !m.GetCustomAttributes(typeof(CompilerGeneratedAttribute), true).Any()) 过滤它们。我的答案或你的答案是否更好似乎不清楚。
  • 嘿。经过几次测试后,我误认为 CompilerGenerated 属性有效,实际上它没有。我的 getter/setter/add/remove 方法没有这个属性。诡异的。也许它只附加到自动实现方法?并且具有用户实现的 setter/getter 方法不会获取此属性。
  • @Dan7 你觉得同时使用这两种方法值得吗?人们似乎并没有就哪种方法最好达成一致。
  • @Dan7:这实际上是关于您认为的“编译器生成的”。从某种意义上说,所有代码都是编译器生成的。据我了解,您希望排除属性获取器/设置器,因为您不认为它们是“真正的”方法。另一方面,编译器仅在显式提供它们的主体时才认为它正在“生成”它们。这就是为什么只有自动生成的属性才用属性标记的原因。现在,如果您想排除为 lambda 表达式等生成的方法,您还必须过滤属性。正如我所说,取决于您的定义。
  • @Ani:好点子。现在既然你解释了,我的措辞看起来确实有点不准确。我更改了标题,但保留了完整的问题主体,因此未来的读者不会对我们正在讨论的内容感到困惑。无论如何感谢您的贡献。尽管该属性并没有解决原来的问题,但我还是学到了一两件事。 :)
【解决方案3】:

秘密是 BindingFlags。DeclaredOnly

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多