2012-02-15 4 views
2

열거 형을 일반적으로 처리하는 방법을 찾고 있지만 작동하도록하는 방법을 찾을 수 없습니다. 나는 몇 가지 열거이 같은 선언 한 말 :Enum을 일반으로 처리 하시겠습니까?

public enum ABC { 
    One, 
    Two, 
    Three 
} 

public enum DEF { 
    Four, 
    Five, 
    Six 
} 

을 내가 매개 변수로 열거를 취하는 방법을 쓰고 싶어 단순히 같은 열거의 이름을 반환합니다 :

public string GetEnumName(Enum anEnum) { 
    return anEnum.GetType().Name; 
} 

하지만 경우 나는 이것을 GetEnumName(DEF)과 같이 부른다. 내가 '변수로 사용되는 형식입니다'오류가 발생합니다. 어떤 아이디어? 감사합니다

EDIT 죄송합니다. 답변으로 판단해도 충분히 명확하지 않을 수 있습니다. 나는 단순히 형식에서 이름을 얻는 방법이 아니라 문제를 설명하기 위해 매우 간단한 예제로 GetEnumName을 선택했습니다. 이 시점 경우에

public string GetEnumName(Type enumType) 
{ 
    return enumType.Name; 
} 

그리고

GetEnumName(typeof(ABC)); 

: 기본적으로 나는에 어떤 열거를 전달하고 직접 그 열거에 따라 행동 할 수 있습니다 방법, 감사

+2

당신은'typeof (DEF)'를 원한다고 생각합니다. – mydogisbox

+0

열거 형의 이름 (예 : GetEnumName (ABC) == "ABC") 또는 값 중 하나의 이름을 찾고 있습니까 (예 : GetEnumName (ABC.One) == "하나")? –

+0

좀 더 일반적으로 예상되는 반환 값의 예를들 수 있습니까? – phoog

답변

1

아마도이 트릭을 수행할까요? 당신이 쓰고 싶은 무엇

public static class EnumExtensions 
{ 
    public static string GetEnumName<T>(this T value) where T : struct 
    { 
     var type = typeof(T); 
     if (!type.IsEnum) 
      throw new InvalidOperationException(string.Format("{0} is not an enum", type)); 
     return type.GetEnumName(value); 
    } 
} 
+0

네, 그게 제가 운전 한 것입니다, 당신과 로메인은 내가 뭘했는지 이해했습니다. 감사합니다. – snappymcsnap

0

그냥 유형을 통과 원하는 당신의 방법은 당신이 아마도 typeof(ABC).Name을 대신 사용할 수있는 아무것도하지 못합니다.

+0

나는 그가 문자열로 (일반적으로 정의 된) 일부 열거 형의 특정 값의 이름을 원한다고 생각한다. –

3

사용 :

public static string GetTypeName<T>() 
{ 
    return typeof(T).Name; 
} 

사용법 : 당신은 할 수 없습니다

var result = GetTypeName<DEF>(); 
0

. 일반 제약 조건은 Enum 형식 (System.Enum 포함)에서 허용되지 않습니다. 대신 Enum.GetName을 사용하십시오.

1

문제는 System.Type 대신에 유형을 전달한다는 것입니다. 방법을 다음으로 변경하십시오.

public string GetEnumName(Type enumType) { 
    return enumType.Name; 
} 
1

이 같은 것입니다 :

public string GetEnumName<T>() where T : Enum 
{ 
    return typeof(T).Name; 
} 

이며, 형식 매개 변수 제약 조건 일반적인 방법.

불행히도 C#에서 열거 형에 대해 이러한 제약 조건을 정의 할 수있는 방법이 없습니다 (또한 대리인을 정의 할 수도 없습니다). 사람들은 대개 @ananthonline에서 언급 한 해결책을 찾으러갑니다.

실제로 이러한 제약 조건은 C# 언어에서 지원되지 않지만 CLR 수준에서 지원됩니다. 예를 들어 Mono.Cecil과 같은 도구를 사용하면 어셈블리를 수정하고 컴파일 한 후 해당 제약 조건을 메서드에 적용하는 데 도움이됩니다.

이 문서에 보라 : Cecil constraint patcher

그리고있다 잊지 마세요 : 당신은 비의 C# 제네릭 형식 매개 변수 제약 - 지원 적용하는 과정을 용이하게하는 도구를 찾을 수 있습니다

Constraining generic constraints enum 구성원의 이름과 값을 사용하려는 경우 Enum 클래스의 유용한 정적 메서드가 많이 있습니다..

+0

예, 제가 운전했던 것이 었습니다. 당신과 ananthonline은 내가 무엇을했는지 이해했습니다. 감사합니다. – snappymcsnap

관련 문제