簡體   English   中英

IEnumerable的擴展方法 <Enum> ?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM