2010-06-11 3 views
10

Kann mir bitte jemand ein Beispiel für die Verwendung von Attribute.isDefined() geben, um zu prüfen, ob ein bestimmtes benutzerdefiniertes Attribut auf eine bestimmte Klasse angewendet wurde?C# Attribut.isDefined() Beispiel?

Ich habe MSDN überprüft, aber sehe nur Möglichkeiten für Attribute auf Baugruppen, Mitglieder usw. Ich bin auch offen für alternative Methoden zur Erreichung der gleichen Sache!

Antwort

6

Ein einfaches Beispiel:

using System; 
using System.Diagnostics; 

[Foo] 
class Program { 
    static void Main(string[] args) { 
     var t = typeof(Program); 
     var ok = Attribute.IsDefined(typeof(Program), typeof(FooAttribute)); 
     Debug.Assert(ok); 
    } 
} 

class FooAttribute : Attribute { } 
+0

Das überprüft ein Mitglied - was ist mit einem Attribut in einer Klasse? Vielleicht funktioniert das auch? – UpTheCreek

+2

Es ist * sehr * unintuitiv, die Type-Klasse erbt MemberInfo. Also die IsDefined (MemberInfo, Type) Überladung wird die Aufgabe erledigt. Code-Snippet aktualisiert –

+0

Ah ich sehe, danke! – UpTheCreek

2

Es scheint keine Überlastung von Attribute.IsDefined zu geben, die eine Type dauert.

Stattdessen Sie können Type.GetCustomAttributes nennen:

if (typeof(SomeClass).GetCustomAttributes(typeof(SomeAttribute), false).Length > 0) 
+0

. Ich frage mich, warum es keine Überlastung gibt? Ich wünschte, mit Attributen zu arbeiten wäre ein bisschen sauberer. Es ist verlockend, Marker-Interfaces zu benutzen und (SomeClass ist SomeMarkerInterface). – UpTheCreek

+1

Dort * ist * eine Überladung, IsDefined (MemberInfo, Type) bekommt die Arbeit erledigt. Überrascht auch von mir :) –

1

Die Type class inherits MemberInfo.
Daher können Sie die overload verwenden, die eine MemberInfo nimmt: Danke

if (Attribute.IsDefined(typeof(SomeClass), typeof(SomeAttribute)) 
+0

Ah, danke das ist schöner für die Augen als mit Länge :) – UpTheCreek