Я вижу три пути.
Я бы, вероятно, просто использовал инструмент, подобный jekyll с его файлами данных .
Положить что-то подобное в mytemplate.md
:
$for(data)$
$data$
$endfor$
Преобразуйте CSV-файл в файл JSON или YAML
, загрузите этот файл с опцией --metadata-file
и используйте шаблон для рендеринга вывода:
Существует много фильтров pandoc (например, pandoc-placetable или pantable ), которые читают CSV и преобразовать его в таблицу Пандока. Но вы хотите преобразовать его в формат метаданных pandoc (который обычно анализируется из фронт-матерства YAML файлов уценки). Я полагаю, вы можете настроить один из этих фильтров pandoc для своих целей.
Хорошо только бросать Ваш интервал 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. Вы могли бы рассмотреть ввод данных пользователем ограничения или обработку случая по умолчанию при использовании перечисления.
Также примечание, что Вы не должны указывать, что Ваше перечисление наследовалось интервалу; это - поведение по умолчанию.
Я вполне уверен, можно сделать явный кастинг здесь.
foo f = (foo)value;
, Пока Вы говорите, что перечисление наследовалось (?) интервалу, который Вы имеете.
enum foo : int
РЕДАКТИРОВАНИЕ Да оказывается, что по умолчанию, перечисления, лежащие в основе типа, являются интервалом. Можно однако использовать любой целочисленный тип кроме символа.
можно также бросить от значения, это не находится в перечислении, производя недопустимое перечисление. Я подозреваю, что это работает, просто изменив тип ссылки и не на самом деле изменив значение в памяти.
перечисление (Ссылка C#)
Перечисляемые типы (Руководство по программированию C#)
Кастинг должен быть достаточно. При использовании 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);
}
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());
}
Вам не нужно наследование. Можно сделать:
(Foo)1
это будет работать ;)