Как я могу получить перечисление, чтобы содержать тире (-)?

Я создаю бизнес-объекты из эту схему с использованием Enterprise Architect.

Схема имеет следующую спецификацию перечисления:

<xs:simpleType name="PackageMedium">
    <xs:restriction base="xs:string">
        <xs:enumeration value="NTP"/>
        <xs:enumeration value="DAT"/>
        <xs:enumeration value="Exabyte"/>
        <xs:enumeration value="CD-ROM"/>
        <xs:enumeration value="DLT"/>
        <xs:enumeration value="D1"/>
        <xs:enumeration value="DVD"/>
        <xs:enumeration value="BD"/>
        <xs:enumeration value="LTO"/>
        <xs:enumeration value="LTO2"/>
        <xs:enumeration value="LTO4"/>
    </xs:restriction>
</xs:simpleType>

Архитектор предприятия генерирует следующий код, но Visual Studio не любит тире (-) на компакт-диске и не компилируется.

public enum PackageMedium : int {
    NTP,
    DAT,
    Exabyte,
    CD-ROM,
    DLT,
    D1,
    DVD,
    BD,
    LTO,
    LTO2,
    LTO4
}

Что я могу сделать, чтобы сделать эту работу?


на основе ответа @Craig Stuntz я смог найти эту статью, которая помогла мне получить эти специальные символы из Enum.

Ответы

Ответ 1

Вы не можете. Полная остановка. Однако есть обходные пути. Вы можете, например, использовать DescriptionAttribute:

public enum PackageMedium : int {
    NTP,
    DAT,
    Exabyte,
    [Description("CD-ROM")]
    CDROM,
    DLT,
    D1,
    DVD,
    BD,
    LTO,
    LTO2,
    LTO4
}

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

Если вам это не нравится, выберите другое обходное решение, например, словарь:

var dict = Enum.GetValues(typeof(PackageMedium))
               .Cast<PackageMedium>()
               .Select(v => Tuple.Create(v == PackageMedium.CDROM ? "CD-ROM" : v.ToString(), v))
               .ToDictionary(t => t.Item1, t => t.Item2);

var myEnumVal = dict["CD-ROM"];

Ответ 2

Короткий ответ: Нет.

Причиной является то, что символ - используется как токен лексером для других целей, таких как представление двоичного и унарного минус-оператора.

Лучше всего либо удалить -, либо заменить его другим символом, который является допустимым символом в именах идентификаторов. Единственным небуквенным символом, который вы обычно можете использовать, является _.

Дополнительную информацию можно найти в С# Specification.

Ответ 3

Идентификатор С# должен начинаться с символа подчеркивания, символа в классе Unicode Lu, Ll, Lt, Lm, Lo или Nl или escape для одного из них. Все остальные символы должны быть из классов Unicode Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd, Pc или Cf или escape для одного из них.

Гипнон-минус относится к категории Pd.

Если С# разрешил это, вы все равно не могли бы использовать его в общедоступном идентификаторе, если вам нужно быть совместимым с CLS, так как оно также не соответствовало бы его правилам.

Это также хорошо, как вы хотели отличить CD-ROM от конкретного элемента в enum от CD-ROM, что означает применение оператора - с CD в качестве операнда левой руки и ROM как правый операнд?

Если этот список возможностей жестко запрограммирован, я просто удалю дефис-минус и < <26 > как метку. Если бы он не был жестко закодирован, я бы использовал словарь, так как он был resiliant перед лицом еще большего числа случаев, когда что-то не может быть идентификатором.