2012-03-01 21 views

Respuesta

8

Esto se debe a que la especificación CLI no exige que los atributos se deriven de Attribute.

La especificación, en II Part 21 (página 225), establece:

Mientras cualquier tipo definido por el usuario puede ser utilizado como un atributo, el cumplimiento CLS requiere que los atributos serán instancias de tipos cuya clase base es System.Attribute. La CLI predefine algunos tipos de atributos y los usa para controlar comportamiento en tiempo de ejecución. Algunos idiomas predefinen los tipos de atributos para representar funciones de lenguaje no directamente representadas en el CTS. Los usuarios u otras herramientas pueden definir y usar tipos de atributos adicionales.

Básicamente, el CLR en sí mismo no puede garantizar que el resultado será Atributo; esto solo es cierto en los lenguajes que cumplen con CLS. Los lenguajes no compatibles con CLS pueden tener atributos de cualquier tipo, lo que significa que ICustomAttributeProvider.GetCustomAttributes (que es la interfaz implementada en cuestión) necesita proporcionar un mecanismo para obtener atributos que no sean derivados del atributo.

+0

Gracias, esto tiene sentido. –

0

por MSDN: http://msdn.microsoft.com/en-us/library/kff8s254.aspx

This method ignores the inherit parameter for properties and events. 
To search the inheritance chain for attributes on properties and events, 
use the appropriate overloads of the Attribute.GetCustomAttributes method. 

Mi entendimiento es lo que permite que incluso puede costumbre un atributo sin heredar de System.Attribute pero escribir totalmente su propia "Atributo", con el que la flexibilidad, su "Atributo" puede solo heredar Objeto a veces

0

Además de lo que Reed dijo anteriormente, la API MemberInfo.GetCustomAttributes le permite especificar un tipo de filtro que influye en el tipo de la matriz que se devuelve. Es decir, cuando especifica typeof (MyAttribute), el resultado será realmente MyAttribute[] (emitido a object[]).

Ahora, cuando especifica una interfaz tipo IMyAttribute, la matriz es del tipo IMyAttribute[]. Y aunque es posible emitir IMyAttribute[] a object[], no es posible convertirlo a Attribute[]. Entonces, en esencia, si el resultado fuese Attribute[], el filtrado basado en interfaces no funcionaría.

(Por cierto, los nuevos Attribute.GetCustomAttributes API - que fija la resolución de la herencia de propiedades y eventos - tienen Attribute[] como su tipo de retorno que hace que el filtrado basado en interfaces imposible, se obtiene una ArgumentException cuando se trata de pasar de un tipo de interfaz para. filtrando.)

Cuestiones relacionadas