23

TryParse以下に示すように、値またはその名前で列挙するコードを記述しました。Flagsこのコードを拡張して、属性を持つ列挙型の解析を含めるにはどうすればよいですか?

    public static bool TryParse<T>(this T enum_type, object value, out T result) 
                where T : struct
            {
                return enum_type.TryParse<T>(value, true, out result);
            }



 public static bool TryParse<T>(this T enum_type, 
object value, bool ignoreCase, out T result)
        where T : struct
    {
        result = default(T);
        var is_converted = false;

        var is_valid_value_for_conversion = new Func<T, object, bool, bool>[]{
            (e, v, i) => e.GetType().IsEnum,
            (e, v, i) => v != null,
            (e, v, i) => Enum.GetNames(e.GetType()).Any(n => String.Compare(n, v.ToString(), i) == 0) || Enum.IsDefined(e.GetType(), v)
        };

        if(is_valid_value_for_conversion.All(rule => rule(enum_type, value, ignoreCase))){
            result = (T)Enum.Parse(typeof(T), value.ToString(), ignoreCase);
            is_converted = true;
        }

        return is_converted;
    }

現在、このコードは次の列挙型に対して機能します。

enum SomeEnum{ A, B, C } 
// can parse either by 'A' or 'a'

enum SomeEnum1 : int { A = 1, B = 2, C = 3 } 
// can parse either by 'A' or 'a' or 1 or "1"

次の場合は機能しません。

[Flags]
enum SomeEnum2 { A = 1, B = 2, C = 4 } // can parse either by 'A' or 'a'
// cannot parse for A|B

ありがとう!

4

3 に答える 3

45

フラグ列挙型は,、ではなく.Net規則を使用して記述され|ます。Enum.Parse()は、'、'文字列を使用する場合に完全に機能します。

[Flags]
public enum Flags
{
    A = 1,
    B = 2,
    C = 4,
    D = 8,
}

var enumString =  (Flags.A | Flags.B | Flags.C).ToString();
Console.WriteLine(enumString); // Outputs: A, B, C
Flags f = (Flags)Enum.Parse(typeof(Flags),  enumString);
Console.WriteLine(f); // Outputs: A, B, C
于 2010-04-30T14:57:34.757 に答える
22

.NET 4の時点で、Enum.TryParse<T>メソッドがあります。すぐに使用できるFlags列挙をサポートします。

string x = (SomeEnum2.A | SomeEnum2.B).ToString();  //  x == "A, B"
SomeEnum2 y;
bool success = Enum.TryParse<SomeEnum2>(x, out y);  //  y == A|B
于 2010-04-30T14:57:22.493 に答える
0

@Popの回答から手がかりが得られ、コードのルールチェックを次のように変更しました。

var is_valid_value_for_conversion = new Func<T, object, bool, bool>[]
{
    (e, v, i) => e.GetType().IsEnum,
    (e, v, i) => value != null,
    (e, v, i) => Enum.GetNames(e.GetType()).Any(
                n => String.Compare(n, v.ToString(), i) == 0 
                || (v.ToString().Contains(",") && v.ToString().ToLower().Contains(n.ToLower()))) 
                || Enum.IsDefined(e.GetType(), v)
};

残りは同じままで、それは私のために働きます

HTH他の誰か

于 2010-04-30T15:31:06.453 に答える