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


81

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

Я знайшов це посилання на допис у блозі, в якому сказано, що тоді це неможливо було використовувати в .NET. Хтось знає, чому вони обирають це, або як я можу використовувати десяткові параметри?


Відповіді:


123

Це обмеження CLR. Тільки примітивні константи або масиви примітивів можуть використовуватися як параметри атрибутів. Причиною тому є те, що атрибут повинен повністю кодуватися в метаданих. Це інакше, ніж тіло методу, кодоване в IL. Використання MetaData лише суворо обмежує область значень, які можна використовувати. У поточній версії CLR значення метаданих обмежені примітивами, null, типами та масивами примітивів (можливо, пропустили другорядний).

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


5
Чи все ще це проблема з Framework 4.0? та 4.5, 4.6.x?
середній простір

@midspace, насправді не проблема, а лише обмеження, нав'язане дизайном. Це прикро, але великі шанси, що воно ніколи не зникне.
Бруно Брант,

1
"Тільки примітивні константи або масиви примітивів можуть використовуватися як параметри атрибутів." Здається, це не зовсім так, наприклад, System.Type також дозволено: msdn.microsoft.com/en-us/library/aa664615(v=vs.71).aspx
DixonD

Using MetaData only severely restricts the scope of values that can be used- Чому це все-таки? Метадані можна використовувати для вказівки на визначення типів. Наприклад, коли ви визначаєте поле в звичайному класі, видаються метадані, які включають ім'я поля та його тип (Будь-який тип, не застосовуючи примітиви). Я не розумію, чому це не можна використовувати для атрибутів.
wingerse

16

У мене така сама проблема. Я вважаю використовувати рядки . Це не безпечно для типу, але це читається, і я думаю, що ми зможемо писати дійсні числа в рядки :-).

class BlahAttribute : Attribute
{
  private decimal value;

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

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

Це не краса, але, розглянувши всі варіанти, вона досить хороша.


1
Схоже, так справляється mbUnit vkreynin.wordpress.com/2007/05/25/…
Енді Дент

2

Коли я зіткнувся з цією ситуацією, я в підсумку виставив властивості атрибута як Double, але всередині атрибуту обробляв їх як десяткові. Далеко не ідеально, але для простих випадків це може бути саме те, що вам потрібно.



0

Ви можете використовувати наступний конструктор. Коли у вас є десятковий літерал у коді C #, компілятор C # видає виклик цьому конструктору.

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

Редагувати: Я знаю, що це не зручно.


2
Якщо це спрацювало в атрибуті, то я здогадуюсь, що просто використання суфікса "m" теж не зробило б, але ні так (використання System.ComponentModel.DefaultValueAttribute як мого тесту)
xr280xr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.