использовать десятичные значения в качестве параметров атрибута в C #? - PullRequest
77 голосов
/ 03 февраля 2009

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

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

Спасибо.

Ответы [ 5 ]

114 голосов
/ 03 февраля 2009

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

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

14 голосов
/ 23 апреля 2010

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

class BlahAttribute : Attribute
{
  private decimal value;

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

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

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

2 голосов
/ 23 июля 2009

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

1 голос
/ 04 февраля 2009

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

0 голосов
/ 23 июля 2009

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

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

Редактировать: я знаю, что это не удобно.

...