Интервал C# к перечислимому преобразованию [дубликат]

Я вижу три пути.

Используйте генератор статических сайтов

Я бы, вероятно, просто использовал инструмент, подобный jekyll с его файлами данных .

Альтернатива 1: преобразовать в YAML и использовать шаблонизатор pandoc

  1. Положить что-то подобное в mytemplate.md:

    $for(data)$
    $data$
    $endfor$
    
  2. Преобразуйте CSV-файл в файл JSON или YAML

  3. , загрузите этот файл с опцией --metadata-file и используйте шаблон для рендеринга вывода:

    [111 ]

Альтернатива 2: написать фильтр pandoc

Существует много фильтров pandoc (например, pandoc-placetable или pantable ), которые читают CSV и преобразовать его в таблицу Пандока. Но вы хотите преобразовать его в формат метаданных pandoc (который обычно анализируется из фронт-матерства YAML файлов уценки). Я полагаю, вы можете настроить один из этих фильтров pandoc для своих целей.

54
задан Community 23 May 2017 в 02:26
поделиться

5 ответов

Хорошо только бросать Ваш интервал Foo:

int i = 1;
Foo f = (Foo)i;

, При попытке бросить значение, это не определило его, будет все еще работать. Единственный вред, который может прибыть из этого, находится в том, как Вы используете значение позже.

, Если Вы действительно хотите удостовериться, Ваше значение определяется в перечислении, можно использовать Перечисление. IsDefined:

int i = 1;
if (Enum.IsDefined(typeof(Foo), i))
{
    Foo f = (Foo)i;
}
else
{
   // Throw exception, etc.
}

Однако использование IsDefined стоит больше, чем просто кастинг. То, которое Вы используете, зависит от Вашего implemenation. Вы могли бы рассмотреть ввод данных пользователем ограничения или обработку случая по умолчанию при использовании перечисления.

Также примечание, что Вы не должны указывать, что Ваше перечисление наследовалось интервалу; это - поведение по умолчанию.

117
ответ дан Jon B 7 November 2019 в 07:45
поделиться

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

foo f = (foo)value;

, Пока Вы говорите, что перечисление наследовалось (?) интервалу, который Вы имеете.

enum foo : int

РЕДАКТИРОВАНИЕ Да оказывается, что по умолчанию, перечисления, лежащие в основе типа, являются интервалом. Можно однако использовать любой целочисленный тип кроме символа.

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

перечисление (Ссылка C#)
Перечисляемые типы (Руководство по программированию C#)

16
ответ дан Cameron MacFarland 7 November 2019 в 07:45
поделиться

Кастинг должен быть достаточно. При использовании C# 3.0, можно сделать удобный дополнительный метод для парсинга перечислимых значений:

public static TEnum ToEnum<TInput, TEnum>(this TInput value)
{
    Type type = typeof(TEnum);

    if (value == default(TInput))
    {
        throw new ArgumentException("Value is null or empty.", "value");
    }

    if (!type.IsEnum)
    {
        throw new ArgumentException("Enum expected.", "TEnum");
    }

    return (TEnum)Enum.Parse(type, value.ToString(), true);
}
5
ответ дан weiran 7 November 2019 в 07:45
поделиться
if (Enum.IsDefined(typeof(foo), value))
{
   return (Foo)Enum.Parse(typeof(foo), value);
}

Hope это помогает

Редактирование , Этот ответ спустился проголосовавший, поскольку значение в моем примере является строкой, где как вопрос, который задают для интервала Мой applogies; следующее должно быть немного более ясным :-)

Type fooType = typeof(foo);

if (Enum.IsDefined(fooType , value.ToString()))
{
   return (Foo)Enum.Parse(fooType , value.ToString());
}
4
ответ дан WestDiscGolf 7 November 2019 в 07:45
поделиться

Вам не нужно наследование. Можно сделать:

(Foo)1 

это будет работать ;)

2
ответ дан Denis Bubnov 7 November 2019 в 07:45
поделиться
Другие вопросы по тегам:

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