2010-02-09 7 views
1

Je voudrais définir une contrainte sur mon attribut personnalisé (PostSharp). Mon but est d'obtenir une erreur ou un avertissement lors de la compilation, si la classe X n'implémente pas l'interface Y mais elle a mon attribut.Attribut personnalisé uniquement sur des classes spécifiques

Donc, cela devrait fonctionner:

[MyAttributeOnlyForY] 
public class X : Y { ... } 

mais cela ne devrait briser le processus de compilation:

[MyAttributeOnlyForY] 
public class X { ... } 

Comment est-il possible?

La raison

Cet attribut fonctionne comme un aspect (ce qui est PostSharp attribute), et je veux être sûr que la classe fournit toutes les informations tissé nécessaires à cet attribut.

Je veux éviter nul résultat sur

(eventArgs.Instance as ILoggerServiceOwner) 

et je pense que complie vérification de temps est une bonne pratique.

Solution

J'ai trouvé un bon départ ici: Validating attribute usage with PostSharp Aspects

Répondre

1

Vous pouvez utiliser la méthode PostSharp réflexion CompileTimeValidate et utiliser pour vérifier si le type a un type dérivé . Cependant, il peut être coûteux en informatique de chercher tous les types dans l'assemblage.

+0

et quelques idées d'ici: http://www.postsharp.org/forum/postsharp-laos/onmethodboundaryaspect-compiletimevalidate-param-issues-t333.html – boj

1

Je pense que cela est impossible. Une meilleure solution pourrait être d'utiliser l'attribut obsolète sur votre constructeur d'attributs personnalisés pour avertir que la classe cible doit mettre en œuvre le Y. interface

+0

C'est bon pour le plan B :) – boj

Questions connexes