2013-02-12 2 views
0

확장 메서드를 열거 형에 추가하려고하지만 아래 코드가 실패합니다. 컴파일러에서 줄에 오류가 발생합니다 StoreType.GetAllItems 확장 메서드를 Enum 형식에 추가하는 방법?확장 및 열거 형

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

선미 er 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); 
    } 
}