2010-09-07 26 views
16

我使用Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)来检索给定类型的方法数组。过滤出由Type.GetMethods()返回的自动生成方法(getter/setter/add/remove/.etc)

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

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

  • 事件SomethingChanged会得到 add_SomethingChanged(EventHandler)remove_SomethingChanged(EventHandler)

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

+0

[寻找从吸气/设定器的MethodInfo的托管的PropertyInfo](可能重复http://stackoverflow.com/questions/520138/finding-the-hosting-propertyinfo-from-the- methodinfo-of-getter-setter) – 2010-09-07 18:39:31

回答

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

我没有考虑并发性,但是它们同时使用的危险是什么?当用谷歌搜索时,我确实看到一些较早的论坛帖子说IsSpecialName在某些情况下不可靠,但是因为他们在.NET 1.0的背景下讨论它,我只是假设这个问题在3.5之前或之前得到解决。 – Dan7 2010-09-12 13:21:51

2

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

+0

你可以使用'Where(m =>!m.GetCustomAttributes(typeof(CompilerGeneratedAttribute),true).Any())'来过滤它们。我的答案或答案是否更好似乎并不明确。 – 2010-09-07 18:59:00

+0

嘿。经过几次更多的测试之后,我错误地发现CompilerGenerated属性起作用,实际上并没有。我的getter/setter/add/remove方法没有这个属性。奇怪的。也许它只附加到自动实现方法?具有用户实现的setter/getter方法不会获得此属性。 – Dan7 2010-09-09 11:23:14

+0

@ Dan7你觉得值得使用两种方法吗?人们似乎并不认为哪种方法是最好的。 – 2010-09-09 12:51:57

-1

秘密是BindingFlags。 DeclaredOnly

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