2016-11-25 1 views
1

Comme indiqué dans le titre, je voudrais savoir s'il existe un moyen de contrainte d'attribut afin que vous obteniez une erreur de compilation si vous appliquez un attribut à une mauvaise propriété ou à une méthode (i aimerait que ces attributs ne s'appliquent qu'à la propriété).Constraint Attribut à la propriété du type donné

Par exemple:

[StringAttribute(..something)] 
public string MyStringPropery { get; set; } //<-- ok pass compile time constraint 

[StringAttribute(..something)] 
public int MyIntProperty { get; set; } //<-- throw error at compile time for type missmatch (that attribute will apply only to string not int) 

[StringAttribute(..something)] 
public string SayHello() //<-- throw error at compile time, that attribute apply only to property not method 
{ 
    return "Hello!" ; 
} 

option sera bien si je peux contrainte mon attribut afin qu'ils puissent être utilisés que dans une classe qui mettent en œuvre l'interface spécifique (ou hérite former une classe de base spécifique).

Répondre

1

La vérification du type de votre propriété ne peut pas être effectuée au moment de la compilation puisque vous n'avez pas accès au membre auquel vous attachez l'attribut. En outre, le compilateur n'instancera pas réellement votre attribut ou n'exécutera pas de code dessus. Il va simplement l'ajouter aux métadonnées de l'assembly. Le compilateur exécute ses contrôles intégrés, que vous ne pouvez pas étendre.

Mais limitant les propriétés peuvent être effectuées dans la définition de l'attribut:

[AttributeUsage(AttributeTargets.Property)] 
public class StringAttribute : Attribute 
{ 
    //Attribute definition 
} 
+0

grâce @Safe cette limite mon problème un peu. Pour la vérification de type, je vais changer l'approche en utilisant une vérification de l'exécution au lieu d'essayer de le faire à la compilation. Jusqu'à présent, vous savez qu'il existe un moyen de contraindre la classe qui utilisera mon attribut? – Skary

+0

Vous voulez dire par ex. une classe avec un certain nom? J'ai peur que ce ne soit pas possible. – Sefe

+0

No i maen une classe tha imeplement une interface par exemple: IConfigurable (mon interface personnalisée) ou hérite d'une classe de base – Skary