铸造型扩展方法

时间:2013-11-19 15:39:28

标签: c# enums

我有一个简单的枚举,看起来如下所示:

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。我猜这可能与扩展方法的工作方式有关 - 或者我错过了一些明显的东西。也许有一种解决方法?

3 个答案:

答案 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());
}