2009-09-14 15 views
18

J'utilise VS2008 et je souhaite créer un avertissement/une erreur de compilation en fonction des attributs personnalisés d'une propriété (si cela est possible).Génération d'un avertissement de compilation personnalisé C#

Il y a deux cas qui me intéressent actuellement:

[MyAttribute (typeof(MyClass)] 

Où MyClass doit implémenter une interface. Actuellement, j'affirme ceci dans le constructeur de l'attribut, mais cela ne rend pas facile à trouver, en raison de la nature de la trace de la pile:

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

    } 

Le deuxième cas qui me intéresse est où j'ai type défini dans un attribut, si ce type implémente une interface, un avertissement devrait être affiché si un autre attribut n'est pas présent.

I.E. si (MyClass.Implements (UneInterface) & &! exists (SomeAttibute)) {Générer} Avertissement

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

Merci!

+0

question intéressante, je suis curieux de savoir si une telle chose est possible. +1 –

+0

Intéressé aussi. –

+0

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

Répondre

7

Vous pouvez le faire avec PostSharp.

Je l'ai fait une fois, et expliqué comment le faire here

+0

Merci beaucoup pour ça! Je l'avais regardé post-sharp avant (pour un autre problème) et décidé contre lui, mais maintenant je pense que je vais réévaluer;) –

+0

Je viens de découvrir un peu d'un problème - il semble que GetCustomAttributes() ne retourne plus l'attribut quand il dérive de PostSharp.Laos.OnMethodInvocationAspect plutôt que System.Attribute –

+0

Vous voulez dire qu'il retourne System.Attribute? Tu ne peux pas le lancer sur ton propre attribut? (GetCustomAttributes renvoie toujours un tableau de System.Attribute AFAIK, donc vous devez toujours lancer le cast –