Question

J'ai essayé d'utiliser des valeurs décimales comme params pour un attribut de champ, mais je reçois une erreur de compilation.

J'ai trouvé ce billet de blog disant il n'a pas été possible d'utiliser .Net alors, quelqu'un sait pourquoi ils ont choisi ce ou comment puis-je utiliser params décimales?

Merci.

Était-ce utile?

La solution

Ceci est une restriction CLR. des constantes ou des tableaux de primitives ne primitives peuvent être utilisés comme paramètres d'attribut. La raison pour laquelle est qu'un attribut doit être codé entièrement dans les métadonnées. Ceci est différent d'un corps de la méthode qui est codée dans IL. L'utilisation MetaData ne limite considérablement la portée des valeurs qui peuvent être utilisées. Dans la version actuelle du CLR, les valeurs de métadonnées sont limitées aux primitives, null, les types et les tableaux de primitives (peut-être manqué un mineur).

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

Autres conseils

J'ai le même problème. Je considère utiliser chaînes . C'est le type-safe, mais il est facile à lire et je pense que nous serons en mesure d'écrire des numéros valides dans les 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, il est assez bon.

Quand j'ai couru dans cette situation, je me suis retrouvé exposer les propriétés de l'attribut comme un double, mais à l'intérieur de l'attribut les traite comme décimal. Loin d'être parfait, mais pour les cas simples, il pourrait être juste ce dont vous avez besoin.

Pour des tours en temps réel avec des attributs je suis en utilisant TypeConverter classe.

Vous pouvez utiliser le constructeur suivant. Lorsque vous avez une décimale littérale dans le code C #, le compilateur C # émet un appel à ce constructeur.

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

Modifier. Je sais que ce ne convient pas

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top