问题
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 getbool get_Enabled()event
SomethingChangedwill getadd_SomethingChanged(EventHandler)andremove_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?
回答1:
typeof(MyType)
.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
.Where(m => !m.IsSpecialName)
回答2:
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.
回答3:
The secret is BindingFlags.DeclaredOnly
typeof(MyType).GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
来源:https://stackoverflow.com/questions/3661539/filtering-out-auto-generated-methods-getter-setter-add-remove-etc-returned-by