c# events reflection properties getmethod

c# - Filtrado de métodos generados automáticamente(getter/setter/add/remove/.etc) devueltos por Type.GetMethods()



events reflection (3)

Creo que lo mejor sería filtrar los métodos que tienen el atributo CompilerGenerated . Es probable que esto sea más seguro para el futuro, aunque eso no tiene en cuenta los futuros compiladores hipotéticos que no respetan este atributo por completo. La prueba IsSpecialName probablemente también sea necesaria, ya que parece que el compilador de C # no adjunta el atributo a los métodos de add y remove eventos.

Utilizo Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) para recuperar una serie de métodos para un tipo dado.

El problema es que el MethodInfo devuelto podría incluir métodos generados por el compilador que no deseo. Por ejemplo:

  • propiedad bool Enabled { get; } bool Enabled { get; } obtendrá bool get_Enabled()

  • el evento SomethingChanged obtendrá add_SomethingChanged(EventHandler) y remove_SomethingChanged(EventHandler)

Probablemente pueda agregar un poco de lógica de filtro para deshacerme de ellos, lo que podría llegar a ser muy complicado. ¿Quiero saber si hay algo más que pueda hacer, como con la configuración de BindingFlags , para recuperar solo los métodos definidos por el usuario?


El secreto es BindingFlags. DeclaredOnly

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


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