0

Enum 型に Extension メソッドを追加しようとしていますが、以下のコードは失敗します。コンパイラは行でエラーを出しますStoreType.GetAllItemsEnum型に拡張メソッドを追加する方法は?

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
        }
    }
}
4

3 に答える 3

1

デフォルトの c# enumをオーバーライドできないため、コンパイラ エラーが表示されます。この記事によると、カスタム クラスにメソッドを追加して、この方法で列挙型をオーバーライドしてみてください。

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);
    }
}
于 2013-02-12T08:05:58.067 に答える
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(...) を使用して名前を解析して列挙型に戻すことができますが、これはあなたが望むものだと思いますか?

于 2013-02-12T08:02:25.480 に答える