Использовать десятичные значения в качестве атрибутов params в С#?
Я пытаюсь использовать десятичные значения в качестве параметров для атрибута поля, но получаю ошибку компилятора.
Я нашел этот пост в блоге ссылка, в котором он не был доступен .Net, кто-нибудь знает, почему они выбирают это или как могу ли я использовать десятичные параметры?
Спасибо.
Ответы
Ответ 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)
Изменить: я знаю, что это не удобно.