gpt4 book ai didi

c# - 自定义枚举解析

转载 作者:行者123 更新时间:2023-11-30 14:28:01 25 4
gpt4 key购买 nike

我有一个枚举如下:

public enum MyEnum {  One,  Two,  Three}

我想将一些字符串削减到上面的枚举,例如,下面的字符串将被解析为 MyEnum.Two:

"Two", "TWO", "Second", "2"

我知道我可以维护一个映射函数来完成这项工作。但是,我只想找到更好的方法,例如重写 Enum.Parse 函数,或类似的方法。我曾尝试使用 IConvertable,但似乎不可能。有什么想法吗?

最佳答案

[AttributeUsage(AttributeTargets.Field, AllowMultiple = true)]
public class NameAttribute : Attribute
{
public readonly string[] Names;

public NameAttribute(string name)
{
if (name == null)
{
throw new ArgumentNullException();
}

Names = new[] { name };
}

public NameAttribute(params string[] names)
{
if (names == null || names.Any(x => x == null))
{
throw new ArgumentNullException();
}

Names = names;
}
}

public static class ParseEnum
{
public static TEnum Parse<TEnum>(string value) where TEnum : struct
{
return ParseEnumImpl<TEnum>.Values[value];
}

public static bool TryParse<TEnum>(string value, out TEnum result) where TEnum : struct
{
return ParseEnumImpl<TEnum>.Values.TryGetValue(value, out result);
}

private static class ParseEnumImpl<TEnum> where TEnum : struct
{
public static readonly Dictionary<string, TEnum> Values = new Dictionary<string,TEnum>();

static ParseEnumImpl()
{
var nameAttributes = typeof(TEnum)
.GetFields()
.Select(x => new
{
Value = x,
Names = x.GetCustomAttributes(typeof(NameAttribute), false)
.Cast<NameAttribute>()
});

var degrouped = nameAttributes.SelectMany(
x => x.Names.SelectMany(y => y.Names),
(x, y) => new { Value = x.Value, Name = y });

Values = degrouped.ToDictionary(
x => x.Name,
x => (TEnum)x.Value.GetValue(null));
}
}
}

然后您可以(注意 [Name] 的双语法、多个 [Name] 或具有多个名称的单个 [Name]):

public enum TestEnum
{
[Name("1")]
[Name("Foo")]
[Name("F")]
[Name("XF", "YF")]
Foo = 1,

[Name("2")]
[Name("Bar")]
[Name("B")]
[Name("XB", "YB")]
Bar = 2
}

TestEnum r1 = ParseEnum.Parse<TestEnum>("XF");
TestEnum r2;
bool r3 = ParseEnum.TryParse<TestEnum>("YB", out r2);

注意使用内部类 (ParseEnumImpl<TEnum>) 来缓存 TEnum “名字”。

关于c# - 自定义枚举解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526757/

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