문제

나는 얻었다 Int16 데이터베이스의 값은이를 열거 형으로 변환해야합니다. 불행히도 반사를 통해 수집 할 수있는 것을 제외하고는 객체에 대해 거의 알지 못하는 코드 레이어에서 수행됩니다.

따라서, 그것은 결국 전화하게됩니다 Convert.ChangeType 유효하지 않은 캐스트 예외로 실패합니다.

나는 다음과 같은 냄새 나는 해결 방법을 찾았다.

String name = Enum.GetName(destinationType, value);
Object enumValue = Enum.Parse(destinationType, name, false);

이 문자열 작업을 통해 이동할 필요가 없도록 더 좋은 방법이 있습니까?

다음은 누군가 실험 해야하는 경우 사용할 수있는 짧지 만 완전한 프로그램입니다.

using System;

public class MyClass
{
    public enum DummyEnum
    {
        Value0,
        Value1
    }

    public static void Main()
    {
        Int16 value = 1;
        Type destinationType = typeof(DummyEnum);

        String name = Enum.GetName(destinationType, value);
        Object enumValue = Enum.Parse(destinationType, name, false);

        Console.WriteLine("" + value + " = " + enumValue);
    }
}
도움이 되었습니까?

해결책

Enum.ToObject(.... 당신이 찾고있는 것입니다!

씨#

StringComparison enumValue = (StringComparison)Enum.ToObject(typeof(StringComparison), 5);

vb.net

Dim enumValue As StringComparison = CType([Enum].ToObject(GetType(StringComparison), 5), StringComparison)

다음 클래스를 사용하여 많은 열거적인 변환을 시도하면 많은 코드를 저장합니다.

public class Enum<EnumType> where EnumType : struct, IConvertible
{

    /// <summary>
    /// Retrieves an array of the values of the constants in a specified enumeration.
    /// </summary>
    /// <returns></returns>
    /// <remarks></remarks>
    public static EnumType[] GetValues()
    {
        return (EnumType[])Enum.GetValues(typeof(EnumType));
    }

    /// <summary>
    /// Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object.
    /// </summary>
    /// <param name="name"></param>
    /// <returns></returns>
    /// <remarks></remarks>
    public static EnumType Parse(string name)
    {
        return (EnumType)Enum.Parse(typeof(EnumType), name);
    }

    /// <summary>
    /// Converts the string representation of the name or numeric value of one or more enumerated constants to an equivalent enumerated object.
    /// </summary>
    /// <param name="name"></param>
    /// <param name="ignoreCase"></param>
    /// <returns></returns>
    /// <remarks></remarks>
    public static EnumType Parse(string name, bool ignoreCase)
    {
        return (EnumType)Enum.Parse(typeof(EnumType), name, ignoreCase);
    }

    /// <summary>
    /// Converts the specified object with an integer value to an enumeration member.
    /// </summary>
    /// <param name="value"></param>
    /// <returns></returns>
    /// <remarks></remarks>
    public static EnumType ToObject(object value)
    {
        return (EnumType)Enum.ToObject(typeof(EnumType), value);
    }
}

이제 글을 쓰는 대신 (StringComparison)Enum.ToObject(typeof(StringComparison), 5); 당신은 단순히 쓸 수 있습니다 Enum<StringComparison>.ToObject(5);.

다른 팁

@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) 많은 시나리오에 유용 해집니다. 예를 들어, ASP.NET의 WebAPI 컨트롤러에는 유효하지 않은 열거 매개 변수에 대한 기본 보호 기능이 없습니다. 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
    }

열거를 데이터 테이블에 저장하지만 열거가 열거이고 어떤 열이든 스트링/int인지 모르는 경우 다음 방식으로 값에 액세스 할 수 있습니다.

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));
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top