2010-09-07 11 views
16

Utilizo Type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic) para recuperar una matriz de métodos para un tipo determinado.Filtrando los métodos autogenerados (getter/setter/add/remove/.etc) devuelto por Type.GetMethods()

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

  • propiedad bool Enabled { get; } se obtener bool get_Enabled()

  • caso SomethingChanged conseguirá add_SomethingChanged(EventHandler) y remove_SomethingChanged(EventHandler)

es probable que pueda añadir un poco de lógica del filtro para deshacerse de ellos que potencialmente podría ser muy complicado. Deseo saber si hay algo más que pueda hacer, como con las configuraciones BindingFlags, para recuperar solo los métodos definidos por el usuario.

+0

posible duplicado de [Encontrar el PropertyInfo de alojamiento de la MethodInfo de captador/definidor] (http://stackoverflow.com/questions/520138/finding-the-hosting-propertyinfo-from-the- methodinfo-of-getter-setter) –

Respuesta

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

No tomé en cuenta la concurrencia, pero ¿qué es lo que hace que el uso simultáneo de ambos sea peligroso? Cuando busqué en Google, vi algunas publicaciones del foro anteriores que decían que IsSpecialName no era confiable en algunos casos, pero como estaban hablando de eso en el contexto de .NET 1.0, supuse que este problema se había abordado antes o en 3.5. – Dan7

2

creo que la mejor opción sería la de filtrar los métodos que tienen el atributo CompilerGenerated. Es probable que esto sea más a prueba de futuro, aunque eso no explica los futuros compiladores hipotéticos que no respetan este atributo por completo. La prueba IsSpecialName es probablemente también requerida ya que parece que el compilador C# no asocia el atributo al evento add y remove métodos.

+0

Puede usar 'Donde (m =>! M.GetCustomAttributes (typeof (CompilerGeneratedAttribute), true) .Any())' para filtrarlos. No parece claro si mi respuesta o tu respuesta es mejor. –

+0

Oye. Después de algunas pruebas más, me equivoqué al decir que el atributo CompilerGenerated funciona, en realidad no es así. Mis métodos getter/setter/add/remove no tienen este atributo. Extraño. ¿Tal vez solo está asociado a los métodos de implementación automática? Y los métodos setter/getter que tienen implementación de usuario no obtienen este atributo. – Dan7

+0

@ Dan7 ¿Encuentraste útil usar ambos métodos al mismo tiempo? No parece que las personas estén de acuerdo sobre cuál es la mejor manera. –

-1

El secreto es BindingFlags. DeclaredOnly

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