¿usar valores decimales como parámetros de atributos en c#?


He estado tratando de usar valores decimales como parámetros para un atributo de campo, pero obtengo un error del compilador.

Encontré esta entrada de blog link diciendo que no era posible usar en. Net entonces, ¿alguien sabe por qué eligen esto o cómo puedo usar parámetros decimales?

Gracias.

Author: rjlopes, 2009-02-03

5 answers

Esta es una restricción CLR. Solo las constantes primitivas o los arrays de primitivas pueden ser usados como parámetros de atributo. La razón es que un atributo debe codificarse completamente en metadatos. Esto es diferente a un cuerpo de método que está codificado en IL. El uso de METADATOS solo restringe severamente el alcance de los valores que se pueden usar. En la versión actual del CLR, los valores de metadatos están limitados a primitivas, null, tipos y matrices de primitivas (puede haber omitido una menor).

Los decimales mientras que un tipo básico no son un tipo primitivo y por lo tanto no se pueden representar en metadatos, lo que evita que sea un parámetro de atributo.

 105
Author: JaredPar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-03 15:26:57

Tengo el mismo problema. Considero usar cadenas . Esto no es seguro de tipo, pero es legible y creo que podremos escribir números válidos en cadenas: -).

class BlahAttribute : Attribute
{
  private decimal value;

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

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

No es una belleza, pero después de considerar todas las opciones, es lo suficientemente bueno.

 13
Author: Stefan Steinegger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-23 14:18:37

Cuando me encontré con esta situación, terminé exponiendo las propiedades del atributo como un Doble, pero dentro del atributo las traté como decimal. Lejos de ser perfecto, pero para los casos simples, podría ser lo que necesita.

 2
Author: ckittel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-23 16:49:55

Para trucos en tiempo real con atributos estoy usando la clase TypeConverter.

 1
Author: Avram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-02-04 12:35:35

Puede utilizar el siguiente constructor. Cuando se tiene un literal decimal en el código C#, el compilador C # emite una llamada a este constructor.

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

Editar: Sé que esto no es conveniente.

 0
Author: Sam Harwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-23 16:52:36