2009-09-14 10 views
18

Ich verwende VS2008 und möchte eine Kompilierungszeit Warnung/Fehler basierend auf benutzerdefinierten Attributen für eine Eigenschaft erstellen (wenn es möglich ist).Generieren einer benutzerdefinierten Kompilierungszeit Warnung C#

Es gibt zwei Fälle, die mich interessieren, zur Zeit:

[MyAttribute (typeof(MyClass)] 

Wo MyClass eine Schnittstelle zu implementieren hat. Zur Zeit behaupten ich dies im Konstruktor des Attributs, jedoch bedeutet dies nicht machen es einfach, aufgrund der Art der Stack-Trace auf die Spur,:

public MyAttribute (Type MyClassType) 
    { 
     System.Diagnostics.Debug.Assert(typeof(MyInterface).IsAssignableFrom(MyClassType), 
             "Editor must implement interface: " + typeof(MyInterface).Name); 

    } 

Der zweite Fall, der mich interessiert, ist, wo ich eine haben Typ, der in einem Attribut definiert ist, wenn dieser Typ eine Schnittstelle implementiert, sollte eine Warnung angezeigt werden, wenn kein anderes Attribut vorhanden ist.

I.E. if (MyClass.Implements (SomeInterface) & &! exists (SomeAttibute)) {Generieren Warnung}

[MyAttribute(typeof(MyClass)] 
// Comment next line to generate warning 
[Foo ("Bar")] 

Dank!

+0

Interessante Frage zu tun, ich bin gespannt, ob so etwas möglich ist. +1 –

+0

Interessiert auch. –

+0

http://stackoverflow.com/questions/154109/custom-compiler-warnings –

Antwort

7

Sie können das mit PostSharp tun.

ich, sobald es getan haben, und erklärt, wie es here

+0

Vielen Dank dafür! Ich hatte mir vorher scharf geschaut (für ein anderes Problem) und entschied es dagegen, aber jetzt denke ich werde ich nochmal nachschauen;) –

+0

Ich habe gerade ein kleines Problem entdeckt - es scheint, dass GetCustomAttributes() nicht mehr zurückkommt Das Attribut, wenn es von PostSharp.Laos.OnMethodInvocationAspect und nicht von System.Attribute –

+0

abgeleitet wird Sie meinen, es gibt System.Attribute zurück? Kannst du es nicht auf deine eigene Eigenschaft übertragen? (GetCustomAttributes gibt immer ein Array von System.Attribute AFAIK zurück, also muss man immer casten, denke ich?) –