J'ai tenté de créer un attribut .NET personnalisé avec le code ci-dessous, mais je l'ai laissé par inadvertance dans la sous-classe. Cela a généré une erreur de compilation facilement corrigée dans le commentaire.Spécification de la classe de base requise pour les cibles d'attribut .NET
// results in compiler error CS0641: Attribute 'AttributeUsage' is
// only valid on classes derived from System.Attribute
[AttributeUsage(AttributeTargets.Class)]
internal class ToolDeclarationAttribute
{
internal ToolDeclarationAttribute()
{
}
}
Ma question est de savoir comment le compilateur connaît l'attribut [AttributeUsage]
ne peut être appliqué à une sous-classe de System.Attribute
? Utilisation de .NET Reflector Je ne vois rien de spécial sur la déclaration de classe AttributeUsageAttribute
elle-même. Malheureusement, cela pourrait être un cas spécial généré par le compilateur lui-même.
[Serializable, ComVisible(true), AttributeUsage(AttributeTargets.Class, Inherited=true)]
public sealed class AttributeUsageAttribute : Attribute
{
...
Je voudrais être en mesure de préciser que mon attribut personnalisé ne peut être placé sur les sous-classes d'une classe particulière (ou interface). Est-ce possible?
Cette restriction est parfois un signe que vous devez utiliser un marqueur d'interface à la place. Il effectue les mêmes fonctions, sauf lorsque vous devez transmettre des métadonnées de niveau classe en tant que paramètre. Donc, si les instances peuvent tout aussi bien fournir say, un décompte de quelque chose, l'interface peut exiger qu'une propriété publique l'obtienne. Si cela doit être au niveau de la classe, vous êtes bloqué avec des attributs. –