2009-09-14 18 views
18

Używam VS2008 i chcę utworzyć ostrzeżenie/błąd czasu kompilacji na podstawie niestandardowych atrybutów właściwości (jeśli jest to możliwe).Generowanie niestandardowego ostrzeżenia o czasie kompilacji C#

Istnieją dwa przypadki, które mnie interesują obecnie:

[MyAttribute (typeof(MyClass)] 

Gdzie MojaKlasa musi implementować interfejs. Obecnie dochodzić tego w konstruktorze atrybutu, jednak to nie ułatwiają wyśledzić, ze względu na charakter ślad stosu:

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

    } 

Druga sprawa, która mnie interesuje, to gdzie mam typ zdefiniowany w atrybucie, jeśli ten typ implementuje interfejs, wówczas ostrzeżenie powinno być wyświetlane, jeśli nie ma innego atrybutu.

I.E. if (MyClass.Implements (SomeInterface) & &! istnieje (SomeAttibute)) {} Generowanie Ostrzeżenie

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

Dzięki!

+0

ciekawe pytanie, jestem ciekaw, czy coś takiego jest możliwe. +1 –

+0

Interesujące również. –

+0

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

Odpowiedz

7

Możesz to zrobić pod numerem PostSharp.

ja kiedyś zrobił, i wyjaśnił, jak to zrobić here

+0

Wielkie dzięki za to! Patrzyłem wcześniej na ostry post (dla innego problemu) i zdecydowałem, że nie, ale teraz myślę, że będę ponownej oceny;) –

+0

Właśnie odkryłem problem - wydaje się, że GetCustomAttributes() już nie zwraca atrybut, gdy pochodzi od PostSharp.Laos.OnMethodInvocationAspect, a nie System.Attribute –

+0

Masz na myśli, że zwraca System.Attribute? Nie możesz rzucić go na swój własny atrybut? (GetCustomAttributes zawsze zwraca tablicę System.Attribute AFAIK, więc zawsze musisz rzutować myślę? –

Powiązane problemy