Почему в Attributes.IsDefined () отсутствуют перегрузки?

165

Вдохновлен таким вопросом. Класс Attribute имеет несколько перегрузок для метода IsDefined () . Покрыты атрибуты, применяемые к Assembly, Module, MemberInfo, ParameterInfo. Перегрузка MemberInfo охватывает PropertyInfo, FieldInfo, EventInfo, MethodInfo, ConstructorInfo.

Это заботится о большинстве AttributeTargets. За исключением одного важного: нет перегрузки для Attribute.IsDefined (Type, Type), чтобы вы могли проверить, определен ли атрибут в классе. Или структура, делегат или перечисление в этом отношении.

Не то чтобы это реальная проблема, Type.GetCustomAttributes () может это исправить. Но все типы BlahInfo тоже имеют это. Я удивляюсь отсутствию симметрии. Я не могу понять, почему это будет проблемой для Type. Гадание на проблему наследования не объясняет это мне. Наличие ValueType в миксе может быть лидером, но все же не имеет смысла. Я не покупаю «они забыли», они никогда не покупают.

Почему эта перегрузка отсутствует?

Ганс Пассант
источник

Ответы:

170

Там есть System.Attribute.IsDefined(MemberInfo element, Type attributeType, bool inherit)и System.Typeпроистекает из System.Reflection.MemberInfo.

Сборка, которая является контейнером верхнего уровня любой сборки .NET, имеет один или несколько модулей. Каждый модуль содержит типы, а типы могут иметь члены, такие как свойства, методы или даже другие типы (вложенные типы). Вот почему System.Typeпроисходит из-за MemberInfoтого, что объектная модель позволяет типам работать как контейнеры для всех элементов, включая другие типы.

Джон Лейдгрен
источник
Перегрузка для ICustomAttributeProviderимеет много смысла тоже.
г-н Андерсон