在c#中将字符串转换为枚举值的最佳方法是什么?
我有一个包含枚举值的HTML选择标记。当页面被发布时,我想获取值(将以字符串的形式)并将其转换为相应的枚举值。
在理想的情况下,我可以这样做:
StatusEnum MyStatus = StatusEnum.Parse("Active");
但这不是有效的代码。
在c#中将字符串转换为枚举值的最佳方法是什么?
我有一个包含枚举值的HTML选择标记。当页面被发布时,我想获取值(将以字符串的形式)并将其转换为相应的枚举值。
在理想的情况下,我可以这样做:
StatusEnum MyStatus = StatusEnum.Parse("Active");
但这不是有效的代码。
当前回答
我开始使用这种方法。性能似乎还可以,但它需要一些样板代码设置。
public enum StatusType {
Success,
Pending,
Rejected
}
static class StatusTypeMethods {
public static StatusType GetEnum(string type) {
switch (type) {
case nameof(StatusType.Success): return StatusType.Success;
case nameof(StatusType.Pending): return StatusType.Pending;
case nameof(StatusType.Rejected): return StatusType.Rejected;
default:
throw new ArgumentOutOfRangeException(nameof(type), type, null);
};
}
}
之后,你可以这样使用它:
StatusType = StatusType.GetEnum("Success");
其他回答
我开始使用这种方法。性能似乎还可以,但它需要一些样板代码设置。
public enum StatusType {
Success,
Pending,
Rejected
}
static class StatusTypeMethods {
public static StatusType GetEnum(string type) {
switch (type) {
case nameof(StatusType.Success): return StatusType.Success;
case nameof(StatusType.Pending): return StatusType.Pending;
case nameof(StatusType.Rejected): return StatusType.Rejected;
default:
throw new ArgumentOutOfRangeException(nameof(type), type, null);
};
}
}
之后,你可以这样使用它:
StatusType = StatusType.GetEnum("Success");
试试这个例子:
public static T GetEnum<T>(string model)
{
var newModel = GetStringForEnum(model);
if (!Enum.IsDefined(typeof(T), newModel))
{
return (T)Enum.Parse(typeof(T), "None", true);
}
return (T)Enum.Parse(typeof(T), newModel.Result, true);
}
private static Task<string> GetStringForEnum(string model)
{
return Task.Run(() =>
{
Regex rgx = new Regex("[^a-zA-Z0-9 -]");
var nonAlphanumericData = rgx.Matches(model);
if (nonAlphanumericData.Count < 1)
{
return model;
}
foreach (var item in nonAlphanumericData)
{
model = model.Replace((string)item, "");
}
return model;
});
}
在这个示例中,您可以发送每个字符串,并设置您的Enum。如果你的Enum有你想要的数据,返回你的Enum类型。
您正在寻找枚举。解析。
SomeEnum enum = (SomeEnum)Enum.Parse(typeof(SomeEnum), "EnumValue");
不确定什么时候添加的,但在Enum类上现在有一个
Parse<TEnum>(stringValue)
与问题中的例子一起用:
var MyStatus = Enum.Parse<StatusEnum >(“Active”)
或者忽略大小写:
var MyStatus = Enum.Parse<StatusEnum >(“active”, true)
下面是它使用的反编译方法:
[NullableContext(0)]
public static TEnum Parse<TEnum>([Nullable(1)] string value) where TEnum : struct
{
return Enum.Parse<TEnum>(value, false);
}
[NullableContext(0)]
public static TEnum Parse<TEnum>([Nullable(1)] string value, bool ignoreCase) where TEnum : struct
{
TEnum result;
Enum.TryParse<TEnum>(value, ignoreCase, true, out result);
return result;
}
使用TryParse的超级简单代码:
var value = "Active";
StatusEnum status;
if (!Enum.TryParse<StatusEnum>(value, out status))
status = StatusEnum.Unknown;