9

列挙型を解析するためのよりエレガントなソリューションを持っている人はいますか?以下は私には混乱のように思えます。

UserType userType = (UserType)Enum.Parse(typeof(UserType), iUserType.ToString());
4

4 に答える 4

14

私はよくそれのための一般的なヘルパーを作ります:

public static T ParseEnum<T>(string value) where T:struct
{
    return (T)Enum.Parse(typeof(T), value);
}

これをJonSkeetの UnstrainedMelody(または他のポストILプロセッサ)と組み合わせて、列挙型に適切な型制約を取得できますが、これはオプションです。

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

var enumValue = ParseEnum<UserType>(iUserType.ToString());

.NET Framework 4.0も付属しEnum.TryParseており、同様の構文を提供し、解析が失敗した場合に処理する方法を提供します。例えば:

UserType userType;
if (Enum.TryParse<UserType>(iUserType.ToString(), out userType))
{
    //Yay! Parse succeeded. The userType variable has the value.
}
else
{
    //Oh noes! The parse failed!
}
于 2012-07-31T14:22:53.847 に答える
4

このような拡張メソッドを作成できます

public static class EnumExtensions
{
    public static T ToEnum<T>(this string s)
    {
        return (T)Enum.Parse(typeof(T), s);
    }
}

次に、コードで次のように使用できます(MyEnumには値AとBが含まれます)。

string s = "B";
MyEnum e = s.ToEnum<MyEnum>();
于 2012-07-31T14:35:43.580 に答える
1

これは、@ vcsjonesのバージョンとフィードバックに基づいた拡張方法であり、@Monesの例からのものです。

public enum TestEnum
{
    None,
    A,
    B,
};

void Main()
{
    var testValues = new List<object>();
    testValues.AddRange(Enumerable.Range(-2, 6).Select(i => (object)i));
    testValues.AddRange(new List<string>() { String.Empty, "A", "B", "C", null });

    foreach (var testValue in testValues)
    {
        Console.WriteLine($"Testing value {testValue ?? String.Empty}:");
        TestEnum output;
        var enumValues = Enum.GetNames(typeof(TestEnum)).ToList();
        try
        {
            if (TestEnum.TryParse(testValue.ToString(), out output))
            {
                Console.WriteLine($"Succeeded with TryParse on {testValue} to {output}");
            }
            else
            {
                Console.WriteLine($"Failed to TryParse on {testValue}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Test harness caught an exception: {ex.ToString()}");
        }

        var toEnumOutput = (testValue ?? String.Empty).ToString().Parse<TestEnum>();
        Console.WriteLine($"Parse<TEnum> returned {toEnumOutput}");

        Console.WriteLine();
        Console.WriteLine();
    }

}


public static class EnumExtensions
{
    public static TEnum Parse<TEnum>(this string value) where TEnum : struct
    {
        TEnum output = default(TEnum);
        var enumValues = Enum.GetNames(typeof(TEnum)).ToList();

        if (Enum.TryParse<TEnum>(value, true, out output))
            if (Enum.IsDefined(typeof(TEnum), value) || value.ToString().Contains(",") || enumValues.Contains(output.ToString()))
            {
                Console.WriteLine($"Converted '{value}' to {output}.");
                return output;
            }
            else
            {
                Console.WriteLine($"{value} is not an underlying value of the enumeration.");
            }
        else
        {
            Console.WriteLine($"{value} is not a member of the enumeration.");
        }
        return default(TEnum);
    }
}

テストハーネスは次の出力を提供します。

Testing value -2:
Succeeded with TryParse on -2 to -2
-2 is not an underlying value of the enumeration.
Parse<TEnum> returned None


Testing value -1:
Succeeded with TryParse on -1 to -1
-1 is not an underlying value of the enumeration.
Parse<TEnum> returned None


Testing value 0:
Succeeded with TryParse on 0 to None
Converted '0' to None.
Parse<TEnum> returned None


Testing value 1:
Succeeded with TryParse on 1 to A
Converted '1' to A.
Parse<TEnum> returned A


Testing value 2:
Succeeded with TryParse on 2 to B
Converted '2' to B.
Parse<TEnum> returned B


Testing value 3:
Succeeded with TryParse on 3 to 3
3 is not an underlying value of the enumeration.
Parse<TEnum> returned None


Testing value :
Failed to TryParse on 
 is not a member of the enumeration.
Parse<TEnum> returned None


Testing value A:
Succeeded with TryParse on A to A
Converted 'A' to A.
Parse<TEnum> returned A


Testing value B:
Succeeded with TryParse on B to B
Converted 'B' to B.
Parse<TEnum> returned B


Testing value C:
Failed to TryParse on C
C is not a member of the enumeration.
Parse<TEnum> returned None


Testing value :
Test harness caught an exception: System.NullReferenceException: Object reference not set to an instance of an object.
   at UserQuery.Main() in C:\Users\Colin\AppData\Local\Temp\3\LINQPad5\_zhvrhwll\query_ludjga.cs:line 49
 is not a member of the enumeration.
Parse<TEnum> returned None

参照:

于 2017-10-10T18:18:13.507 に答える
1

ああ、これ以上のことを行うTyler BrinkleyのEnums.NETライブラリに出くわしました!

この他のStackOverflowの回答C#のEnum.Parseの汎用バージョンは、JonSkeetのUnconstrainedMelodyライブラリサイトにつながり、代わりにEnums.NETに移動します。わお。

于 2017-10-10T21:42:34.770 に答える