10
votes

Spécifiez la classe de base requise pour les objectifs d'attribut .NET

J'ai essayé de créer un attribut personnalisé .NET avec le code ci-dessous mais laissé accidentellement la sous-classe. Cela a généré une erreur de compilateur facilement fixe indiquée dans le commentaire.

[Serializable, ComVisible(true), AttributeUsage(AttributeTargets.Class, Inherited=true)]
public sealed class AttributeUsageAttribute : Attribute
{
    ...


1 commentaires

Cette restriction est parfois un signe que vous devriez utiliser une interface de marqueur à la place. Il effectue les mêmes fonctions, sauf lorsque vous devez passer des métadonnées de niveau de classe comme paramètre. Donc, si les cas peuvent tout aussi facilement fournir, un nombre de quelque chose, l'interface peut nécessiter une propriété publique qui. Si cela doit être au niveau de la classe, vous êtes coincé avec des attributs.


3 Réponses :


2
votes

attributeUSAGAttribute est juste une classe magique (comme attribut est). Ceci est une règle de compilateur intégrée et vous ne pouvez pas faire quelque chose comme ça pour vos propres attributs.


0 commentaires

27
votes

Je voudrais être capable de spécifier que mon attribut personnalisé ne peut être placé que sur des sous-classes d'une classe (ou d'une interface) particulière. Est-ce possible?

En fait, il existe un moyen de le faire pour les sous-classes (mais pas d'interfaces) à l'aide de protégé - voir restreindre l'utilisation d'attributs . Reproduire le code (mais pas la discussion): xxx


1 commentaires

Excellent, merci! Pour être honnête, je n'ai jamais envisagé de faire cela avant d'avoir eu l'erreur du compilateur mais je vais certainement votre solution.



0
votes

avec Restomer Vous pouvez utiliser [jetbrains.annotations.basetypequiité (typeof (YoubaSetype))]


0 commentaires