использовать десятичные значения в качестве параметров атрибутов в c#?


Я пытался использовать десятичные значения в качестве параметров для атрибута поля, но я получаю ошибку компилятора.

Я нашел это сообщение в блоге ссылке говоря, что это было невозможно в .Net использовать тогда, кто-нибудь знает, почему они выбирают это или как я могу использовать десятичные параметры?

спасибо.

5 71

5 ответов:

Это ограничение среды CLR. В качестве параметров атрибута могут использоваться только примитивные константы или массивы примитивов. Причина заключается в том, что атрибут должен быть полностью закодирован в метаданных. Это отличается от тела метода, который кодируется в IL. Использование метаданных только сильно ограничивает область значений, которые могут быть использованы. В текущей версии среды CLR значения метаданных ограничены примитивами, null, типами и массивами примитивов (возможно, пропустили незначительный).

десятичные знаки, в то время как базовый тип не является примитивным типом и, следовательно, не может быть представлен в метаданных, что не позволяет ему быть параметром атрибута.

У меня та же проблема. Я считаю, чтобы использовать строки. Это не типобезопасно, но это читаемо, и я думаю, что мы сможем написать допустимые числа в строках :-).

class BlahAttribute : Attribute
{
  private decimal value;

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

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

Это не красота, но после рассмотрения всех вариантов, это достаточно хорошо.

когда я столкнулся с этой ситуацией, я в конечном итоге выставил свойства атрибута как Double, но внутри атрибута рассматривал их как Decimal. Далеко не идеально, но для простых случаев, это просто может быть то, что вам нужно.

для трюков в реальном времени с атрибутами я использую TypeConverter класса.

вы можете использовать следующий конструктор. При наличии десятичного литерала в коде C# компилятор C# вызывает этот конструктор.

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

Edit: я знаю, что это не удобно.