Использовать десятичные значения в качестве атрибутов params в С#? - программирование
Подтвердить что ты не робот

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

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

class BlahAttribute : Attribute
{
  private decimal value;

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Изменить: я знаю, что это не удобно.