[英]Extension Methods for 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
}
我為任何Enum編寫了一個擴展方法,以獲取Description屬性(如果有)。 很簡單吧......
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>'
那么為什么呢? 我可以做這個嗎?
我在這一點上找到的唯一答案是為泛型T編寫擴展方法,如下所示:
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
有人必須有一個更好的答案,或解釋為什么我可以擴展一個枚舉但不是一個IEnumerable的枚舉......任何人?
.NET泛型協方差僅適用於引用類型。 這里, MyEnum
是一個值類型, System.Enum
是一個引用類型(從枚舉類型到System.Enum
是一個裝箱操作)。
因此, IEnumerable<MyEnum>
不是IEnumerable<Enum>
,因為這會將每個枚舉項的表示從值類型更改為引用類型; 只允許表示保留轉換。 您需要使用已發布的通用方法技巧來實現此功能。
從v4開始,C#支持通用接口和委托的協方差和反方差。 但不幸的是,這些* - 方差僅適用於引用類型,它不適用於值類型,例如枚舉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.