【问题标题】:Extension methods and Enums扩展方法和枚举
【发布时间】:2011-07-01 13:39:29
【问题描述】:

我有一个枚举

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

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

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

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

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

我想这样应用它:MyEnum.GetStringValues()

有可能吗?

【问题讨论】:

    标签: .net enums extension-methods


    【解决方案1】:

    虽然您不能为类型添加静态扩展方法,但可以如下声明一个新类:

    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);
        }
    }
    

    【讨论】:

    • 可以给泛型方法类型参数添加枚举约束吗?
    • 不幸的是,我不认为你可以,你能做的最好的事情就是等待 Jon Skeet 回答(我认为他在他的书中涵盖了它)或者使用反射类型来检查它是否枚举并抛出异常不是。
    • @serhio:不,你能做的最好的就是值类型约束。
    • @Patrick:您实际上可以使用where TEnum : struct, IComparable, IConvertible, IFormattable 稍微严格地约束。 (而且 +1,我会给出几乎相同的答案。)
    【解决方案2】:

    有可能吗?

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

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

    【讨论】:

    • 想知道您建议在哪里添加此方法? tahat 枚举实例的扩展方法?
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    相关资源
    最近更新 更多