19

この質問をして申し訳ありませんが、私はこのタスクの正しい解決策を見つけられませんでした:

「myEnum」という名前の列挙型があります(MyEnumは関数では認識されません)myEnumの値のint値を取得する必要があります

例:
その列挙型に「myEnum」という名前のプログラマー:

 public enum myEnum
 {
     foo = 1,
     bar = 2,
 }

私の関数は次のことを行う必要があります:文字列によって「myEnum」の「foo」の値を取得します

関数は次の方法で開く必要があります。

 public int GetValueOf(string EnumName, string EnumConst)
 {

 }

したがって、プログラマーAがそれを開くと:

 int a = GetValueOf("myEnum","foo");

1を返す必要があります

プログラマーBが「mySpace」という名前の列挙型を持っている場合、値5の「bar」を返したい

int a = GetValueOf("mySpace","bar")

5を返す必要があります

これどうやってするの?

4

4 に答える 4

30

Enum.Parseを使用してこれを行うことができますが、列挙型の完全修飾型名が必要になります。つまり、次のようになります"SomeNamespace.myEnum"

public static int GetValueOf(string enumName, string enumConst)
{
    Type enumType = Type.GetType(enumName);
    if (enumType == null)
    {
        throw new ArgumentException("Specified enum type could not be found", "enumName");
    }

    object value = Enum.Parse(enumType, enumConst);
    return Convert.ToInt32(value);
}

Convert.ToInt32また、これはキャストの代わりに使用することに注意してください。これは、ではない基になる型を持つ列挙値を処理しますInt32OverflowExceptionただし、列挙型の基になる値がanの範囲外のInt32場合(つまり、値が>であるためにulongの場合)、これでもがスローされますint.MaxValue

于 2012-09-04T19:50:02.407 に答える
7

してみてください

int result = (int) Enum.Parse(Type.GetType(EnumName), EnumConst);
于 2012-09-04T19:43:59.850 に答える
2

列挙型の名前を文字列として指定する必要があるかどうかはわかりません。

Enumの値を取得するには、Enum.TryParseを使用する必要があります。一般的な方法と組み合わせて、次のようなことを行うことができます。

public int? GetValueOf<T>(string EnumConst) where T : struct
{
    int? result = null;

    T temp = default(T);
    if (Enum.TryParse<T>(EnumConst, out temp))
    {
        result = Convert.ToInt32(temp);
    }

    return result;
}

これを呼び出すには、次を使用します。

int? result = GetValueOf<myEnum>("bar");
if (result.HasValue)
{
    //work with value here.
}
于 2012-09-04T19:56:55.517 に答える