Почему ICustomAttributeProvider.GetCustomAttributes() возвращает объект[] вместо атрибута[]?

#c# #.net #system.reflection #getcustomattributes

#c# #.net #system.reflection #getcustomattributes

Вопрос:

Почему ICustomAttributeProvider.GetCustomAttributes() возвращает object[] вместо Attribute[] ?

Есть ли какие-либо обстоятельства, при которых использование ICustomAttributeProvider реализаций из mscorlib и системных сборок будет возвращать объекты, которые не имеют типа Attribute ?

Ответ №1:

Спецификация CLI (ECMA 335), раздел II, пункт 21, частично гласит:

Хотя в качестве атрибута можно использовать любой пользовательский тип, соответствие CLS требует, чтобы атрибуты были экземплярами типов, базовым классом которых является System.Attribute .

Другими словами, язык, не совместимый с CLS, может позволить вам указывать атрибуты, которые не являются производными от Attribute , поэтому GetCustomAttributes метод, вероятно, предназначен для того, чтобы разрешить использование таких атрибутов.

Я почти уверен, что такого языка, не совместимого с CLS, не существует, и .NET его не поддерживает, но можно представить, что разработчики Reflection не хотели исключать такую возможность в будущем.

Что касается вашего второго вопроса, быстрый просмотр исходного кода для System.Reflection показывает, что вы всегда получаете Attribute[] ответ. Поскольку возвращаемые объекты всегда Attribute[] , вы можете безопасно приводить их, но нет гарантии, что это всегда будет работать таким образом.

Ответ №2:

Бегло взглянув на Reflector, в каждом месте, где он используется, они выполняют безопасное приведение к Attribute[] , так что, я думаю, для вас безопасно делать то же самое.