扩展方法和枚举

时间:2011-07-01 13:39:30

标签: .net enums extension-methods

我有一个Enum

Public Enum MyEnum
    <StringValue("Bla Bla")> _
    BlaBla

    <StringValue("bbble bbble")> _
    BleBle
End Enum

我做了一个扩展方法(GetStringValue),它接受Enum并返回StringValueAttribute的值,如果有的话。

我可以Dim sValue = MyEnum.BlaBla.GetStringValue()

现在,我想要一个“扩展”方法,它将所有枚举值作为字符串列表返回给我。

我想像这样申请:MyEnum.GetStringValues()

有可能吗?

2 个答案:

答案 0 :(得分:3)

虽然您无法向类型添加静态扩展方法,但您可以按如下方式声明一个新类:

class EnumHelper
{
    public static IEnumerable<string> GetStringValues<TEnum>()
        where TEnum : struct, IComparable, IFormattable, IConvertible
    {
        var enumType = typeof(TEnum);

        if (!enumType.IsEnum) {
            throw new ArgumentException("T must be an enumerated type");
        }

        foreach (Enum item in Enum.GetValues(enumType))
        {
            yield return item.GetStringValue();
        }
    }
}

并按如下方式调用:

class Program
{
    enum Rainbow { Red, Orange, Yellow, Green, Blue, Indigo, Violet }

    static void Main(string[] args)
    {
        foreach (var item in EnumHelper.GetStringValues<Rainbow>())
        {
            Console.WriteLine(item);

        }

        Console.ReadKey(false);
    }
}

答案 1 :(得分:2)

  

有可能吗?

没有。您可以将扩展方法添加到特定类型的实例,但不能添加到特定类型本身。

这是考虑这个问题的一种方法:扩展方法只是静态类上静态方法的语法糖,其中方法的第一个参数是扩展方法的“接收者”。是否可以在静态类上编写静态方法,该静态类的第一个参数是某些,如MyEnum?不能。您不能将类型名称作为参数传递给方法(您可以传递类型句柄的实例(例如,typeof(MyEnum)),但不能传递类型名称本身)。因此,你所要求的是不可能的。