Pourquoi Attributes.IsDefined () manque-t-il des surcharges?

165

Inspiré d'une question SO. La classe Attribute a plusieurs surcharges pour la méthode IsDefined () . Sont couverts les attributs appliqués à Assembly, Module, MemberInfo, ParameterInfo. La surcharge MemberInfo couvre PropertyInfo, FieldInfo, EventInfo, MethodInfo, ConstructorInfo.

Cela prend en charge la plupart des AttributeTargets. Sauf pour un gros: il n'y a pas de surcharge pour Attribute.IsDefined (Type, Type) afin que vous puissiez vérifier si un attribut est défini sur une classe. Ou une structure, un délégué ou une énumération d'ailleurs.

Non pas que ce soit un réel problème, Type.GetCustomAttributes () peut le résoudre. Mais tous les types BlahInfo l'ont aussi. Je m'interroge sur le manque de symétrie. Je ne peux pas comprendre pourquoi ce serait un problème pour Type. Deviner un problème d'héritage ne me l'explique pas. Avoir ValueType dans le mix peut être une piste, cela n'a toujours pas de sens. Je n'achète pas "ils ont oublié", ils ne le font jamais.

Pourquoi cette surcharge manque-t-elle?

Hans Passant
la source

Réponses:

170

Il y a un System.Attribute.IsDefined(MemberInfo element, Type attributeType, bool inherit)et System.Typedérive de System.Reflection.MemberInfo.

Un assembly, qui est le conteneur de niveau supérieur de tout assembly .NET, possède un ou plusieurs modules. Chaque module contient alors des types et des types peuvent avoir des membres tels que des propriétés, des méthodes ou même d'autres types (types imbriqués). C'est pourquoi System.Typedérive de MemberInfoafin que le modèle objet permette aux types de fonctionner en tant que conteneurs de tous les membres, y compris d'autres types.

John Leidegren
la source
Une surcharge ICustomAttributeProvideraurait également beaucoup de sens.
Mr Anderson