2011-02-10 7 views

Respuesta

6

Yo prefiero usar PropertyInfo.GetIndexParameters:

var indexers = targetType.GetProperties(bindingFlags) 
         .Where(p => p.GetIndexParameters().Any()); 
         .Select(p => p.GetGetMethod()); 

ahora indexers es un IEnumerable<MethodInfo> de los captadores de los indexadores que coinciden con el BindingFlags especificada dada en bindingFlags.

Observe cómo se lee el código del targetType, obtenga las propiedades que coincidan con bindingFlags, tome las que son un indexador y luego proyecte en el captador. Es mucho menos misterioso que usar la cadena mágica "get_Item", y múltiples indexadores se manejan fácilmente.

Si sabe que solo hay uno, podría usar Single. Si está buscando uno específico de muchos, puede inspeccionar el resultado de GetIndexParameters en consecuencia.

+0

Quiero el MethodInfo, no el PropertyInfo. – smartcaveman

+0

@smartcaveman: Wow. 'Use PropertyInfo.GetGetMethod' en lo que le he dado arriba. – jason

2

La forma correcta es recuperar DefaultItemAttribute para la clase. Tiene el nombre de la propiedad del indexador. No tiene que ser "Artículo", los lenguajes como VB.NET permiten especificar cualquier propiedad para ser el indexador. El código de Jason también les fallará, puede haber más de una propiedad indexada. Pero solo un defecto.

+0

¿Tiene alguna documentación para esto? No puedo encontrarlo por ninguna parte. – smartcaveman

+0

MSDN, observe la palabra clave predeterminada de VB.NET y la clase DefaultMemberAttribute. –

Cuestiones relacionadas