2009-04-21 4 views
2

Est-il possible de limiter le nombre de propriétés auxquelles un attribut est appliqué dans une classe particulière?C# Limite d'attribut

+1

Non. Pourquoi voulez-vous faire cela? –

Répondre

3

Au moment de la compilation no. Lors de l'exécution, vous pouvez valider ceci via un initialiseur statique qui lance si cet invariant est violé bien que ce soit considéré comme un style très pauvre, il serait sûr dans le sens qu'aucun code ne pourrait s'exécuter alors que l'invariant ne tient pas.

Si vous pensez à l'extensibilité inhérente à .Net, même si vous pouvez le vérifier au moment de la compilation imaginer:

dll A avec la compilation

public class Foo 
{ 
    public int Property1 {get;} 
} 

B faisant référence dll compilation A.dll avec classe

public class Bar 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property2 {get;} 
} 

vous recompiler A.dll avec

public class Foo 
{ 
    [OnlyOneAllowedOnAnyPropertiesPerClass] 
    public int Property1 {get;} 
} 

et tenter de lancer cette nouvelle A.dll avec l'ancien B.dll (ils sont binaires compatibles à tous autres égards cela est si bien)

Il est clair que le temps d'exécution aurait à faire bon sens d'un effort considérable de vérifier cela, non pour mentionner que B pourrait ne pas être chargé pendant un certain temps soudainement Rendre un ou les deux A et B 'illégaux'.

Par conséquent, vous ne devriez pas attendre que cette fonctionnalité soit disponible dans le framework.

1

Je ne pense pas que ce soit possible au moment de la compilation. Mais vous pouvez ajouter du code aux constructeurs d'instance ou à un constructeur statique qui vérifie cela via la réflexion au moment de l'exécution.

1

S'il est important (ou juste après) la compilation, vous devez créer une règle FxCop ou une recherche personnalisée pour votre attribut (comme modèle [OnlyOnceAttribute]).

findstr "[OnlyOnceAttribute]" *.cs 

Le findstr utilitaire renvoie les lignes correspondantes. Vous n'avez besoin que d'un fichier batch qui capture le nombre de lignes et get back d'une erreur à l'appelant (= tâche MSBuild), et la génération échoue.

+0

bonne idée mais notez que les classes partielles et l'héritage vont à la fois renverser cette et plusieurs classes dans un fichier causerait des faux positifs. Aller à une règle FxCop correcte fonctionnerait tant que vous avez accès à la base de code totale sous forme compilée. – ShuggyCoUk