Permettre à un Attribut personnalisé uniquement sur le type spécifique
Est-il un moyen de forcer le compilateur à restreindre l'utilisation d'un attribut personnalisé à être utilisé uniquement sur les propriété de type int, short, string (tous les types primitifs)?
semblable à la AttributeUsageAttribute's ValidOn-AttributeTargets énumération.
- Non, ce n'est pas possible. Le mieux que vous puissiez faire est d'écrire un test unitaire qui utilise la réflexion et valide son utilisation. Mais rien dans le compilateur va le faire.
- aussi, vous ne pouvez pas ajouter des attributs de classes en dehors de votre contrôle, en tout cas - de sorte que vous ne pouvez pas ajouter des attributs à
int
oustring
. Voulez-vous dire "uniquement pour les propriétés qui sontint
oustring
" ? si oui, la réponse est toujours "non" ;p - bien sûr je ment int, string propriétés et de ne pas modifier la classe int lui-même, Mais je vais modifier. merci pour la réponse.
- Des bons, des solutions concrètes ont été donnés sur ce double, qui a demandé à seulement 15 jours plus tard: stackoverflow.com/questions/8574275/...
Vous devez vous connecter pour publier un commentaire.
Non, vous ne pouvez pas, dans le fond. Vous pouvez le limiter à
struct
vsclass
vsinterface
, c'est à son sujet. Plus: vous ne pouvez pas ajouter des attributs à des types de l'extérieur de votre code de toute façon (sauf viaTypeDescriptor
, ce qui n'est pas le même).Vous pouvez exécuter ce test pour le vérifier.
D'abord, déclarer la validation de l'attribut PropertyType:
Créer des unités de test:
Votre attribut, par exemple, permettre seulement décimal types de propriété:
Exemple de modèle:
Vous pouvez écrire le code vous-même pour faire respecter le bon usage de votre attribut de la classe, mais c'est comme beaucoup que vous pouvez faire.
Le code ci-dessous renvoie une erreur si l'attribut a été placé sur une propriété/domaine qui n'est pas la Liste de chaîne de caractères.
La ligne
if (!(value is List<string> list))
peut être un C#6 ou 7 fonctionnalité.ValidationAttribute
?Assembly location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.ComponentModel.DataAnnotations.dll
et l'espace de nomsusing System.ComponentModel.DataAnnotations;