2011-03-02 5 views
4

나는이 하나를 가지고있는 경우 열거가 설명 속성을 얻을 수 있도록 IEnumerable 용 확장 메서드 <Enum>?

public enum MyEnum 
{ 
    [Description("Army of One")] 
    one, 
    [Description("Dynamic Duo")] 
    two, 
    [Description("Three Amigo's")] 
    three, 
    [Description("Fantastic Four")] 
    four, 
    [Description("The Jackson Five")] 
    five 
} 

내가 확장 방법을 썼습니다 ... 같은 다른 열거의 무리가 있습니다. 간단한만큼 바로 ...
public static string GetDescription(this Enum currentEnum) 
{ 
    var fi = currentEnum.GetType().GetField(currentEnum.ToString()); 
    var da = (DescriptionAttribute)Attribute.GetCustomAttribute(fi, typeof(DescriptionAttribute)); 
    return da != null ? da.Description : currentEnum.ToString(); 
} 

나는 아주 간단하게 이것을 사용할 수 있으며 예상대로 설명이나 ToString()를 반환 매력처럼 작동합니다.

그래도 문제가 있습니다. IEnumerable MyEnum, YourEnum 또는 SomeoneElsesEnum에서 호출 할 수있는 기능이 필요합니다. 그래서 나는 다음과 같은 확장을 간단히 썼습니다.

public static IEnumerable<string> GetDescriptions(this IEnumerable<Enum> enumCollection) 
{ 
    return enumCollection.ToList().ConvertAll(a => a.GetDescription()); 
} 

이것은 작동하지 않습니다. 메서드로 잘 컴파일되지만 다음과 같은 오류가 발생합니다.

Instance argument: cannot convert from 'System.Collections.Generic.IEnumerable<MyEnum>' to System.Collections.Generic.IEnumerable<System.Enum>' 

왜 그렇습니까? 나는이 작품을 만들 수 있습니까?

public static IEnumerable<string> GetDescriptions<T>(this List<T> myEnumList) where T : struct, IConvertible 
public static string GetDescription<T>(this T currentEnum) where T : struct, IConvertible 

누군가가 이것에 대한 더 나은 답변을, 또는 내가 열거 확장 할 수있는 이유에 대한 설명이 있어야합니다

나는이 시점에서 발견 한 유일한 대답은 다음과 같이 일반적인 T에 대한 확장 메서드를 작성하는 것입니다 Enum의 IEnumerable은 아니지만 ... 누구?

답변

7

.NET 일반 공분산은 참조 형식에서만 작동합니다. 여기에서 MyEnum은 값 유형이고 System.Enum은 참조 유형입니다 (열거 형에서 System.Enum으로의 캐스팅이 복싱 작업 임).

그래서 IEnumerable<MyEnum>은 각 열거 항목의 표현을 값 유형에서 참조 유형으로 변경하므로 IEnumerable<Enum>이 아닙니다. 표현 보존 만 가능합니다. 이 기능을 사용하려면 게시 한 일반 메소드 트릭을 사용해야합니다.

0

v4에서 시작하여 C#은 제네릭 인터페이스 및 대리인에 대한 공동 분산 및 반 분산을 지원합니다. 하지만 유감스럽게도 이러한 * 변수는 참조 유형에서만 작동하며 열거 형과 같은 값 유형에서는 작동하지 않습니다.

관련 문제