2010-05-24 4 views
6

Gibt es eine Möglichkeit, eine Kompilieranforderung für bestimmte Attribute in einer Klassen- oder Schnittstellenimplementierung durchzusetzen?Wie kann ich ein Attribut für eine Klassendefinition benötigen?

Angenommen, meine Anwendung verwendet eine Reihe von statischen Klassen, die const int Ressourcenwerte enthalten. Ich möchte die Klasse in einem Description Attribut dekorieren, um ihren Inhalt zu beschreiben. Im Konzept möchte ich diese Attributanforderung auf eine Schnittstelle anwenden, dann würde jede statische Klasse sie mit der erforderlichen Description implementieren. Ich könnte eine Laufzeitprüfung oder einen Komponententest schreiben, um die Einhaltung zu überprüfen. Aber eine Kompilierung wäre am besten.

Gibt es so etwas?

Antwort

6

Nein, es gibt nichts Vergleichbares. Komponententests sind das Beste, was Sie tun können, soweit ich weiß.

Wenn Sie die Klassen automatisch identifizieren können (anhand des Namens oder eines anderen Attributs, mit dem die Klasse versehen ist), können Sie problemlos einen Komponententest für alle Klassen in einer Baugruppe schreiben.

+0

+1 Ich zweite Einheit-Tests dafür, einfach zu schreiben und obwohl es nicht Wenn der Compiler sich beschweren sollte, werden Sie frühzeitig auf fehlende Informationen hingewiesen. –

1

Es ist in der Laufzeit über Reflection möglich.

Hier ist ein Unit-Test-Methode für Sie:

... 
using System.Reflection; 
using System.Diagnostics; 
using System.Linq; 
... 

[TestMethod] 
public void CheckAttributes() 
{ 
    var notAttributed = Assembly.GetAssembly(typeof(SomeClass)) 
     .GetTypes() 
     .Where(t => t.GetCustomAttributes(typeof(MyAttribute), true).Count() == 0); 

    Assert.AreEqual<int>(0, notAttributed.Count()); 
} 

Wo MyAttribute Typ Ihres Attribut ist, und SomeClass ist eine Klasse, in der Baugruppe Sie überprüfen möchten.
Sie können auch die Typen filtern, die Sie auf diese Weise überprüfen möchten. (Nur wenn Sie nicht jede Klasse in einer Baugruppe benötigen dieses Attribut zu verwenden, natürlich.)


Wenn Sie es in der Produktion Code tun mögen, legen Sie ein Conditional("DEBUG") Attribut darauf, sicherzustellen, dass es wird nur im DEBUG-Modus ausgeführt.
(Weil Reflektion nicht schnell ist, und es wirklich keinen Sinn macht, dies im Produktionsmodus zu tun, oder?)

+0

Es ist sinnvoll, es in Ihren * Unit-Tests * gegen den Produktionscode auszuführen. Warum würden Sie es konditional machen und den Test selbst in Ihren Produktionscode einfügen? –

+0

@Jon - Ich habe es bearbeitet, jetzt ist es ein Komponententest. Macht es jetzt Sinn? : P – Venemo

+0

Alle außer Sie testen die ausführende Assembly, die eine Unit Test Assembly ist und daher wahrscheinlich nicht Ihre Produktionscode :) (Ich würde 'typeof (SomeWellKnownType) .Assembly'.) –

Verwandte Themen