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)
yremove_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)