Por que as sobrecargas Attributes.IsDefined () estão ausentes?

165

Inspirado por uma pergunta SO. A classe Attribute possui várias sobrecargas para o método IsDefined () . Cobertos são os atributos aplicados a Assembly, Module, MemberInfo, ParameterInfo. A sobrecarga MemberInfo abrange PropertyInfo, FieldInfo, EventInfo, MethodInfo, ConstructorInfo.

Isso cuida da maioria dos AttributeTargets. Exceto por um biggy: não há sobrecarga para Attribute.IsDefined (Type, Type) para que você possa verificar se um atributo está definido em uma classe. Ou uma estrutura, delegado ou enum para esse assunto.

Não que isso seja um problema real, Type.GetCustomAttributes () pode corrigir isso. Mas todos os tipos de BlahInfo também têm isso. Eu me pergunto pela falta de simetria. Não sei por que isso seria um problema para o Type. Adivinhar um problema de herança não me explica isso. Ter ValueType no mix pode ser uma vantagem, ainda não faz sentido. Eu não compro "eles esqueceram", eles nunca compram.

Por que essa sobrecarga está faltando?

Hans Passant
fonte

Respostas:

170

Há um System.Attribute.IsDefined(MemberInfo element, Type attributeType, bool inherit)e System.Typederiva System.Reflection.MemberInfo.

Um assembly, que é o contêiner de nível superior de qualquer assembly .NET, possui um ou mais módulos. Cada módulo contém tipos e tipos podem ter membros como propriedades, métodos ou até outros tipos (tipos aninhados). É por isso que System.Typederiva de, MemberInfopara que o modelo de objeto permita que tipos funcionem como contêineres em todos os membros, incluindo outros tipos.

John Leidegren
fonte
Sobrecarga para ICustomAttributeProviderfaria muito sentido também.
Anderson Anderson