0

以下のスタブで、(MyEnum) をパラメーターとして渡して、この手順を任意の列挙型で使用できるようにするにはどうすればよいですか?

public static Enum Proc(this Enum e)
{
Int32 i = (Int32)(MyEnum)e;
...

これが私が思いついた解決策です。

public static Enum Next(this Enum e, Type eT)
{
  Int32 i = (Int32)(Object)e;   
  return (Enum)Enum.Parse(eT, Enum.GetName(eT, Enum.GetName(eT, ++i) == null? i = 0 : i));  
}

次の値を取得するためにこれを行う必要があるため、このソリューションは理想的ではありません。

MyEnum e = (MyEnum)e.Next(typeof(MyEnum));

むしろやりたい

MyEnum e = e.Next(typeof(MyEnum));

またはさらに良い:

MyEnum e = e.Next();

簡単な解決策を提供できる人なら誰でも要点をつかむことができます。

また、上で書いたコードは LinqPad では問題なく動作しますが、WP7 でしかコンパイルできず、実行すると例外 (InvalidProgramException) がスローされます。

4

2 に答える 2

1

これは、任意の値を循環する関数ですenum

static public Enum Cycle(this Enum e)
{
    bool found = false;
    Enum first = null;
    foreach (Enum i in Enum.GetValues(e.GetType()))
    {
        if (first == null)
            first = i;
        if (found)
            return i;
        found = e.Equals(i);
    }
    if (found)
        return first;
    return null;
}

を持たないバージョンのC#のEnum.GetValues場合、このようなメソッドを使用する必要があります。このメソッドは、値が0から始まり、1ずつ増加する列挙型に対してのみ機能します。

static public Enum Cycle(this Enum e)
{
    var i = ((IConvertible)e).ToInt64(null) + 1;
    var eT = e.GetType();
    var next = Enum.GetName(eT, i);
    return (Enum)Enum.Parse(eT, next ?? Enum.GetName(eT, 0), false);
}

次のように使用します。

var nextEnum = (MyEnum)curEnum.Cycle();
于 2012-06-23T19:13:57.137 に答える
1

編集:これを更新して、列挙値の番号付けに関係なく、強く型付けされたリスト内の次の列挙型を返すようにしました。これを .NET 4 でコンパイルして実行することができ、WP7 で試したことはありませんが、SL/WP7 で見つからない/無効になっているものを使用しているとは思いません。

public static T Next<T>(this T e) where T : struct
{
    var t = typeof(T);
    if (!t.IsEnum) throw new ArgumentException("T must be an enumerated type");
    if (!Enum.IsDefined(t, e)) throw new ArgumentException();
    var intValue = (int)t.GetField(e.ToString()).GetValue(null);
    var enumValues = t.GetFields(BindingFlags.Public | BindingFlags.Static).Select(x => x.GetValue(null));
    var next = (T?)enumValues.Where(x => (int)x > intValue).Min();
    if (next.HasValue)
        return next.Value;
    else
        return (T)enumValues.Min();
}

次のように簡単に使用できます。

var nextE = e.Next();
于 2012-06-23T16:35:16.783 に答える