>

다음과 같은 항목을 표시하는 콤보 상자가 있습니다 :

Equals
Not Equals 
Less Than
Greater Than

이 문자열에는 공백이 포함되어 있습니다. 다음과 같은 항목과 일치하는 열거 형이 정의되어 있습니다.

enum Operation{Equals, Not_Equals, Less_Than, Greater_Than};

공백이 허용되지 않기 때문에 _ 문자를 사용했습니다.

이제 C #에서 루프 나 if 조건을 작성하지 않고 주어진 문자열을 자동으로 열거 형 요소로 변환하는 방법이 있습니까?


  • 답변 # 1

    와이즈 비즈를 짓는 것이 좋습니다  친숙한 이름을 열거 형 상수에 매핑하고 요소 자체에서 일반적인 명명 규칙을 사용합니다.

    Dictionary<string, Operation>
    
    

    또는 현재 방법을 고수하고 싶을 경우에는 수행하지 않는 것이 좋습니다.

    enum Operation{ Equals, NotEquals, LessThan, GreaterThan };
    var dict = new Dictionary<string, Operation> {
        { "Equals", Operation.Equals },
        { "Not Equals", Operation.NotEquals },
        { "Less Than", Operation.LessThan },
        { "Greater Than", Operation.GreaterThan }
    };
    var op = dict[str];
    
    

  • 답변 # 2

    Mehrdad의 답변에 따라 사전을 사용하여 전용 매퍼를 만들거나 TypeConverter를 구현하십시오.

    맞춤형 TypeConverter가 var op = (Operation)Enum.Parse(typeof(Operation), str.Replace(' ', '_')); 를 대체 할 수 있음  (또는 그 반대) 또는 열거를 반영하고 항목의 표시 텍스트를 결정하는 속성을 사용할 수 있습니다.

    " " -> "_"
    
    

    이 구현은 여러 가지 방법으로 개선 될 수 있습니다 :

    일반화

    변환 대상으로 구현

    지원 FlagsAttribute

  • 답변 # 3

    enum Operation
    {
        [DisplayName("Equals")]
        Equals, 
        [DisplayName("Not Equals")]
        Not_Equals, 
        [DisplayName("Less Than")]
        Less_Than, 
        [DisplayName("Greater Than")]
        Greater_Than
    };
    public class OperationTypeConverter : TypeConverter
    {
        private static Dictionary<string, Operation> operationMap;
        static OperationTypeConverter()
        {
            BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.GetField
                | BindingFlags.Public;
            operationMap = enumType.GetFields(bindingFlags).ToDictionary(
                c => GetDisplayName(c)
                );
        }
        private static string GetDisplayName(FieldInfo field, Type enumType)
        {
            DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(typeof(DisplayNameAttribute));
            return (attr != null) ? attr.DisplayName : field.Name;
        }
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            string stringValue = value as string;
            if (stringValue != null)
            {
                Operation operation;
                if (operationMap.TryGetValue(stringValue, out operation))
                {
                    return operation;
                }
                else
                {
                    throw new ArgumentException("Cannot convert '" + stringValue + "' to Operation");
                }
            }
        }
    }
    
    

    "같지 않음"의 경우 위 문장에서 공백을 밑줄로 바꿔야합니다

    편집 : 다음 버전은 구문 분석을 시도하기 전에 공백을 밑줄로 바꿉니다.

    Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals")
    
    

  • 답변 # 4

    구문 분석법을 사용할 수 있습니다 :

    string someInputText;
    var operation = (Operation)Enum.Parse(typeof(Operation), someInputText.Replace(" ", "_"));
    
    

    여기의 예제

  • 답변 # 5

    다른 방법을 사용해야하는 이유 : 열거 형을 문자열로 변환 하시겠습니까?

    열거에서 콤보 상자의 항목을 생성하십시오.

    Operarion operation = (Operation)Enum.Parse(typeof(Operation), "Not_Equals");

관련 자료

  • 이전 windows 10의 docker-compose - 이미지를 찾을 수 없습니까?
  • 다음 javascript - Vuetify에서 클릭하면 v-data-table에서 행을 강조 표시하는 방법은 무엇입니까?