Почему GetCustomAttributes возвращает объект [] вместо Attribute []? - PullRequest
8 голосов
/ 01 марта 2012

Просто любопытно, см. MemberInfo.GetCustomAttributes.Это намекает на то, что он может содержать объект без атрибутов?

Ответы [ 3 ]

8 голосов
/ 01 марта 2012

Это связано с тем, что в спецификации CLI атрибуты не наследуются от атрибута.

Спецификация в II Part 21 (стр. 225) гласит:

Хотя в качестве атрибута можно использовать любой определенный пользователем тип, соответствие CLS требует, чтобы атрибуты были экземплярами типов, базовый класс которых - System.Attribute.CLI предопределяет некоторые типы атрибутов и использует их для управления поведением во время выполнения.Некоторые языки предопределяют типы атрибутов для представления языковых функций, которые не представлены непосредственно в CTS.Пользователи или другие инструменты могут определять и использовать дополнительные типы атрибутов.

По сути, сам CLR не может гарантировать, что результатом будет атрибут - это верно только для языков, совместимых с CLS.Языки, не совместимые с CLS, могут иметь атрибуты любого типа, что означает ICustomAttributeProvider.GetCustomAttributes (это рассматриваемый реализованный интерфейс) должен обеспечивать механизм для получения производных от атрибутов атрибутов.

0 голосов
/ 19 февраля 2013

В дополнение к тому, что Рид сказал выше, API MemberInfo.GetCustomAttributes позволяет вам указать тип фильтра, который влияет на тип возвращаемого массива. То есть, когда вы указываете typeof (MyAttribute), на самом деле результат будет MyAttribute[] (приведен к object[]).

Теперь, когда вы указываете тип интерфейса IMyAttribute, массив имеет тип IMyAttribute[]. И хотя можно разыграть IMyAttribute[] до object[], невозможно разыграть его до Attribute[]. Так что, по сути, в результате Attribute[] фильтрация по интерфейсам не сработала бы.

(Кстати, более новые Attribute.GetCustomAttributes API - которые исправляют разрешение наследования для свойств и событий - имеют Attribute[] в качестве типа возврата. Это делает фильтрацию по интерфейсам невозможной; вы получаете ArgumentException при попытке передать в тип интерфейса для фильтрации.)

0 голосов
/ 01 марта 2012

Для 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.

Насколько я понимаю, это позволяет вам даже настраивать атрибут без наследования от System.Attribute, но полностью написать свой собственный "атрибут", с такой гибкостьюАтрибут "может наследоваться только от объекта иногда

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...