gpt4 book ai didi

.net - 具有Flags属性的Enum.TryParse

转载 作者:行者123 更新时间:2023-12-03 13:41:07 25 4
gpt4 key购买 nike

我已按值或其名称将代码写到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

谢谢!

最佳答案

标志枚举是通过使用.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

关于.net - 具有Flags属性的Enum.TryParse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2745320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com