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

  1. Единственная простая альтернатива заключается в том, чтобы на самом деле ввести новую строку в переменную:
    $ STR='new
    line'
    $ printf '%s' "$STR"
    new
    line
    
    Да, это означает запись Enter, где это необходимо в коде.
  2. Существует несколько эквивалентов new line.
    \n           ### A common way to represent a new line character.
    \012         ### Octal value of a new line character.
    \x0A         ### Hexadecimal value of a new line character.
    
    Но все они требуют «интерпретации» каким-либо инструментом ( POSIX printf ):
    echo -e "new\nline"           ### on POSIX echo, `-e` is not required.
    printf 'new\nline'            ### Understood by POSIX printf.
    printf 'new\012line'          ### Valid in POSIX printf.
    printf 'new\x0Aline'       
    printf '%b' 'new\0012line'    ### Valid in POSIX printf.
    
    И поэтому инструмент должен построить строку с новой строкой:
    $ STR="$(printf 'new\nline')"
    $ printf '%s' "$STR"
    new
    line
    
  3. В некоторых оболочках последовательность $ 'является специальным расширением оболочки. Известны работы в ksh93, bash и zsh:
    $ STR=$'new\nline'
    
  4. Конечно, возможны и более сложные решения:
    $ echo '6e65770a6c696e650a' | xxd -p -r
    new
    line
    
    Или
    $ echo "new line" | sed 's/ \+/\n/g'
    new
    line
    
77
задан rjlopes 3 February 2009 в 15:23
поделиться

5 ответов

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

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

116
ответ дан JaredPar 6 November 2019 в 03:41
поделиться

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

1
ответ дан Avram 6 November 2019 в 03:41
поделиться

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

2
ответ дан 24 November 2019 в 10:57
поделиться

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

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

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

0
ответ дан 24 November 2019 в 10:57
поделиться

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

class BlahAttribute : Attribute
{
  private decimal value;

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

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

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

14
ответ дан 24 November 2019 в 10:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: