扩展和枚举类型
问题描述:
我想将扩展方法添加到枚举类型,但下面的代码失败。编译器给出的错误行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
}
}
}
答
你必须调用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(...)将名称解析回枚举,我认为这是你想要的?
答
你看到的编译器错误,因为你不能覆盖默认的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);
}
}