开发者

Filtering out auto-generated methods (getter/setter/add/remove/.etc) returned by Type.GetMethods()

开发者 https://www.devze.com 2023-01-15 18:20 出处:网络
I use Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) to retrieve an array of methods for a given type.

I use Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) to retrieve an array of methods for a given type.

The problem is the returned MethodInfo could include methods that are generated by the compiler which I don't want. For example:

  • property bool Enabled { get; } will get bool get_Enable开发者_运维知识库d()

  • event SomethingChanged will get add_SomethingChanged(EventHandler) and remove_SomethingChanged(EventHandler)

I can probably add some filter logic to get rid of them which could potentially get very complicated. I want to know if there is something else I can do, such as with BindingFlags settings, to retrieve only user defined methods?


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


I think your best bet would be to filter out methods that have the CompilerGenerated attribute. This is likely to be more future-proof, although that doesn't account for hypothetical future compilers disrespecting this attribute entirely. The IsSpecialName test is probably also required since it appears as though the C# compiler does not attach the attribute to event add and remove methods.


The secret is BindingFlags.DeclaredOnly

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

精彩评论

暂无评论...
验证码 换一张
取 消