我有一个简单的枚举,看起来如下所示:
public enum Brand
{
[Description("Friendly Brand Name")]
Brand1,
[Description("Once Again")]
Brand2
} // eo enum Brand
我有一个带有以下签名的扩展方法:
public static string ToDescription(this Enum self) { /* .. implementation .. */ }
快速检查LINQPad向我显示:
Brand brand = Brand.Brand1;
brand.ToDescription().Dump();
......一切正常。
现在来了有趣的部分。在我的代码中,此时我想迭代一个arbitary枚举的值(在这种情况下是Brand
),而我只有一个System.Type
继续。首先,我为Array
实施了一种快速扩展方法:
public static IEnumerable<object> AsEnumerable(this Array self)
{
foreach(object o in self)
yield return o;
} // eo AsEnumerable
知道我的类型是Enum
,我会迭代这些值(其中type
是实际的Brand
枚举类型)(注意:CastTo
只是一个Convert.ChangeType
)的简写扩展方法:
foreach (var enumValue in Enum.GetValues(type).AsEnumerable().Select((e) => e.CastTo(type)))
Console.WriteLine(enumValue.ToDescription());
我收到以下运行时错误:
'MyNameSpace.Brand' does not contain a definition for 'ToDescription'
调试,在即时窗口中,enumValue
的类型确实是Brand
。我猜这可能与扩展方法的工作方式有关 - 或者我错过了一些明显的东西。也许有一种解决方法?
答案 0 :(得分:1)
我认为您的CastTo
只是在运行时更改了类型,为什么不使用Cast<T>
呢?
foreach (var enumValue in Enum.GetValues(type).Cast<Enum>())
Console.WriteLine(enumValue.ToDescription());
答案 1 :(得分:0)
我能想到的最直接的方法是Dictionary
描述:
public static class YourClass
{
public enum Brand { Brand1, Brand2 }
private static Dictionary<Brand, string> Descriptions {get; set;}
static YourClass()
{
YourClass.Descriptions.Add(Brand.Brand1, "Friendly name 1");
YourClass.Descriptions.Add(Brand.Brand2, "Friendly name 2");
}
public static string ToDescription(this Brand brand)
{
// error checking left out
return YourClass.Descriptions[brand];
}
}
这种方法还可以让您轻松扩展,例如在您的“描述”中轻松支持多种语言,或者利用DAL ......
答案 2 :(得分:0)
扩展方法实际上只是一些静态方法的编译时语法糖,你可以直接调用它。所以他们依赖于静态已知的变量类型。
请注意,AsEnumerable
已经是Array
,而不是使用IEnumerable
方法,System.Linq在IEnumerable
上提供了两个有用的扩展方法,以获得IEnumerable<T>
}:Cast<T>
和OfType<T>
。这两个都会产生类型化的枚举,所以你可以这样做:
foreach (var enumValue in Enum.GetValues(type).Cast<Enum>()) {
Console.WriteLine(enumValue.ToDescription());
}
事实上,你也可以使用foreach
中的旧隐式演员:
foreach (Enum enumValue in Enum.GetValues(type)) {
Console.WriteLine(enumValue.ToDescription());
}