90 votes

utiliser des valeurs décimales comme paramètres d'attribut dans c #?

J'ai essayé d'utiliser des valeurs décimales comme paramètres pour un attribut de champ, mais j'obtiens une erreur du compilateur.

J'ai trouvé ce lien de blog disant qu'il n'était pas possible d'utiliser. Net à ce moment-là. Quelqu'un sait-il pourquoi il choisit ceci ou comment puis-je utiliser des paramètres décimaux?

Merci.

132voto

JaredPar Points 333733

C'est un CLR restriction. Seule primitive des constantes ou des tableaux de primitives peuvent être utilisés comme paramètres d'attribut. La raison en est qu'un attribut doit être codé entièrement dans les métadonnées. Ceci est différent de celui d'un corps de méthode qui est codé dans l'ILLINOIS. À l'aide de Métadonnées sévèrement restreint la portée des valeurs qui peuvent être utilisées. Dans la version actuelle de la CLR, les valeurs de métadonnées sont limitées à des fonctions primitives, null, types et des tableaux de primitives (peut-être manqué un mineur).

Les décimales de tout un type de base ne sont pas un type primitif et ne peut donc pas être représentée dans les métadonnées qui l'empêche d'être un attribut de paramètre.

20voto

Stefan Steinegger Points 37073

J'ai le même problème. Je considère utiliser des chaînes . Ce n'est pas sûr, mais c'est lisible et je pense que nous pourrons écrire des nombres valides dans des chaînes :-).

 class BlahAttribute : Attribute
{
  private decimal value;

  BlahAttribute(string number)
  {
    value = decimal.Parse(number, CultureInfo.InvariantCulture);
  }
}

[Blah("10.23")]
class Foo {}
 

Ce n'est pas une beauté, mais après avoir examiné toutes les options, c'est assez bon.

2voto

ckittel Points 2819

Lorsque j'ai rencontré cette situation, j'ai fini par exposer les propriétés de l'attribut en tant que double, mais à l'intérieur de l'attribut, elles les traitaient comme des valeurs décimales. Loin d'être parfait, mais pour les cas simples, c'est peut-être ce dont vous avez besoin.

1voto

Avram Points 3044

Pour les astuces en temps réel avec les attributs, j'utilise la classe TypeConverter .

-1voto

280Z28 Points 49515

Vous pouvez utiliser le constructeur suivant. Lorsque vous avez un littéral décimal en code C #, le compilateur C # émet un appel à ce constructeur.

Decimal(Int32, Int32, Int32, Boolean, Byte)

Edit: Je sais que ce n'est pas pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X