62
задан 3 February 2009 в 16:28

2 ответа

Если Вы храните Перечисление в 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));
    }
}
0
ответ дан 31 October 2019 в 14:20

На основе ответа @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
    }
0
ответ дан 31 October 2019 в 14:20

Другие вопросы по тегам:

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