Ich habe versucht, ein benutzerdefiniertes .NET-Attribut mit dem folgenden Code zu erstellen, aber versehentlich die Unterklasse verlassen. Dies führte zu einem leicht zu korrigierenden Compilerfehler, der im Kommentar angezeigt wurde.Angeben der erforderlichen Basisklasse für .NET-Attributziele
// results in compiler error CS0641: Attribute 'AttributeUsage' is
// only valid on classes derived from System.Attribute
[AttributeUsage(AttributeTargets.Class)]
internal class ToolDeclarationAttribute
{
internal ToolDeclarationAttribute()
{
}
}
Meine Frage ist, wie funktioniert der Compiler weiß, dass das [AttributeUsage]
Attribut kann nur auf eine Unterklasse von System.Attribute
angewendet werden? .NET Reflector verwenden Ich sehe nichts besonderes auf der Klassen-Deklaration AttributeUsageAttribute
. Leider könnte dies ein spezieller Fall sein, der vom Compiler selbst generiert wird.
[Serializable, ComVisible(true), AttributeUsage(AttributeTargets.Class, Inherited=true)]
public sealed class AttributeUsageAttribute : Attribute
{
...
Ich mag wäre in der Lage sein, dass meine benutzerdefinierten Attribute angeben, nur auf Subklassen einer bestimmten Klasse platziert werden (oder Schnittstelle). Ist das möglich?
Diese Einschränkung verwenden, ist manchmal ein Zeichen sollten Sie stattdessen einen Marker-Schnittstelle verwenden. Es führt die gleichen Funktionen aus, außer wenn Sie Metadaten auf Klassenebene als Parameter übergeben müssen. Also, wenn Instanzen können genauso einfach sagen, eine Zählung von etwas, kann die Schnittstelle eine öffentliche Eigenschaft verlangen, dass. Wenn es auf Klassenebene sein muss, bleiben Sie bei den Attributen stecken. –