2013-02-12 127 views
0

我想将扩展方法添加到枚举类型,但下面的代码失败。编译器给出的错误行StoreType.GetAllItems如何将扩展方法添加到枚举类型?扩展和枚举类型

namespace ConsoleApplication1 
{ 

    public static class EnumExtensions 
    { 
     public static IEnumerable<T> GetAllItems<T>(this Enum value) 
     { 
      foreach (object item in Enum.GetValues(typeof(T))) 
      { 
       yield return (T)item; 
      } 
     } 


    } 

    class Program 
    { 

     [Flags] 
     public enum StoreType 
     { 
      Paypal = 1, 
      Plimus = 2, 
      Other = 3 
     }; 

     static void Main(string[] args) 
     {    
      StoreType.GetAllItems //Fail here 
     } 
    } 
} 

回答

1

你必须调用GetAllItems上的值,而不是一个类型:

StoreType.Paypal.GetAllItems() 

但它不会是最好不要让它的扩展方法连接声明为:

public static class EnumExtensions 
{ 
    public static IEnumerable<T> GetAllItems<T>() 
    { 
     foreach (object item in Enum.GetValues(typeof(T))) 
     { 
      yield return (T)item; 
     } 
    } 
} 
static void Main(string[] args) 
{    
    var allEnumItems = EnumExtensions.GetAllItems<StoreType>() 
} 

甚至:

Enum.GetValues(typeof (StoreType)); 
Enum.GetNames(typeof (StoreType)); 

前前后后呃,你可以使用Enum.TryParse(...)将名称解析回枚举,我认为这是你想要的?

1

你看到的编译器错误,因为你不能覆盖默认的C#枚举,根据to this article尝试重写你的枚举这种方式,通过添加方法的自定义类:

public class MyEnum 
{ 
    public static readonly MyEnum A = new MyEnum("A"); 
    public static readonly MyEnum B = new MyEnum("B"); 
    public static readonly MyEnum C = new MyEnum("C"); 
    public static IEnumerable<T> GetAllItems<T>(this Enum value) 
    { 
     foreach (object item in Enum.GetValues(typeof(T))) 
     { 
      yield return (T)item; 
     } 
    } 

    public override string ToString() 
    { 
     return Value; 
    } 

    protected MyEnum(string value) 
    { 
     this.Value = value; 
    } 

    public string Value { get; private set; } 
} 

public sealed class MyDerivedEnum : MyEnum 
{ 
    public static readonly MyDerivedEnum D = new MyDerivedEnum("D"); 

    private MyDerivedEnum(string value) 
     : base(value) 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyEnum blah = MyEnum.A; 
     System.Console.WriteLine(blah); 
     blah = MyDerivedEnum.D; 
     System.Console.WriteLine(blah); 
    } 
}