Если Вы храните Перечисление в DataTable, но не знаете, какой столбец является перечислением и который является строкой/интервалом, можно получить доступ к значению этот путь:
foreach (DataRow dataRow in myDataTable.Rows)
{
Trace.WriteLine("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
foreach (DataColumn dataCol in myDataTable.Columns)
{
object v = dataRow[dataCol];
Type t = dataCol.DataType;
bool e = false;
if (t.IsEnum) e = true;
Trace.WriteLine((dataCol.ColumnName + ":").PadRight(30) +
(e ? Enum.ToObject(t, v) : v));
}
}
На основе ответа @Peter вот метод для Nullable<int>
к Enum
преобразование:
public static class EnumUtils
{
public static bool TryParse<TEnum>(int? value, out TEnum result)
where TEnum: struct, IConvertible
{
if(!value.HasValue || !Enum.IsDefined(typeof(TEnum), value)){
result = default(TEnum);
return false;
}
result = (TEnum)Enum.ToObject(typeof(TEnum), value);
return true;
}
}
Используя EnumUtils.TryParse<YourEnumType>(someNumber, out result)
становится полезным для многих сценариев. Например, Контроллер WebApi в Asp.NET не имеет защиты по умолчанию от недопустимых Перечислимых параметрических усилителей. Asp.NET будет просто использовать default(YourEnumType)
значение, даже если некоторые передачи null
, -1000
, 500000
, "garbage string"
или полностью проигнорируют параметр. Кроме того, ModelState
будет допустимо во всех этих случаях, таким образом, одно из решения состоит в том, чтобы использовать int?
тип с пользовательской проверкой
public class MyApiController: Controller
{
[HttpGet]
public IActionResult Get(int? myEnumParam){
MyEnumType myEnumParamParsed;
if(!EnumUtils.TryParse<MyEnumType>(myEnumParam, out myEnumParamParsed)){
return BadRequest($"Error: parameter '{nameof(myEnumParam)}' is not specified or incorrect");
}
return this.Get(washingServiceTypeParsed);
}
private IActionResult Get(MyEnumType myEnumParam){
// here we can guarantee that myEnumParam is valid
}