#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[] , так что, я думаю, для вас безопасно делать то же самое.