将字符串解析为枚举类型
我有一个像这样的枚举类型作为示例:
public Enum MyEnum {
enum1, enum2, enum3 };
我将从配置文件中读取一个字符串。我需要的是将字符串解析为 MyEnum 类型或 null 或未定义。不确定以下代码是否有效(很抱歉现在无法访问我的 VS):
// example: ParseEnum<MyEnum>("ENUM1", ref eVal);
bool ParseEnum<T>(string value1, ref eVal) where T : Enum
{
bool bRet = false;
var x = from x in Enum.GetNames(typeof(T)) where
string.Equals(value1, x, StringComparison. OrdinalIgnoreCase)
select x;
if (x.Count() == 1 )
{
eVal = Enum.Parse(typeof(T), x.Item(0)) as T;
bRet = true;
}
return bRet;
}
不确定它是否正确或是否有其他简单的方法将字符串解析为 MyEnum 值?
I have an enum type like this as an example:
public Enum MyEnum {
enum1, enum2, enum3 };
I'll read a string from config file. What I need is to parse the string to MyEnum type or null or not defined. Not sure if the following code will work (sorry for not having access to my VS right now):
// example: ParseEnum<MyEnum>("ENUM1", ref eVal);
bool ParseEnum<T>(string value1, ref eVal) where T : Enum
{
bool bRet = false;
var x = from x in Enum.GetNames(typeof(T)) where
string.Equals(value1, x, StringComparison. OrdinalIgnoreCase)
select x;
if (x.Count() == 1 )
{
eVal = Enum.Parse(typeof(T), x.Item(0)) as T;
bRet = true;
}
return bRet;
}
Not sure if it is correct or there is any other simple way to parse a string to a MyEnum value?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
怎么样:
用作:(
注意:旧版本在
Enum.Parse
周围使用try/catch
)What about something like:
Used as:
(Note: old version used
try/catch
aroundEnum.Parse
)输出:
OUTPUT:
这是一个老问题,但现在 .NET 4.5 有
Enum.TryParse()
。This is an old question, but now .NET 4.5 has
Enum.TryParse<TEnum>()
.我在 UnconstrainedMelody 中有一个
TryParseName
方法,这是一个用于委托和枚举实用程序方法通过一些构建后技巧使用“无法表达的”约束。 (使用该库的代码不需要后期构建,只是为了清楚起见。)您可以像这样使用它:
我目前没有不区分大小写的版本,但我可以轻松地引入一个如果你愿意的话。请注意,这个不会像内置版本那样尝试解析数字,例如“12”,也不会尝试解析以逗号分隔的标志列表。我可能会在稍后添加标志版本,但我在数字版本中看不到太多意义。
这是在没有装箱和执行时类型检查的情况下完成的。拥有约束真的很方便:)
如果您发现不区分大小写的解析有用,请告诉我......
I have a
TryParseName
method in UnconstrainedMelody, a library for delegate and enum utility methods which uses "inexpressible" constraints via some postbuild trickery. (Code using the library doesn't need a postbuild, just to be clear.)You would use it like this:
I don't currently have a case-insensitive version, but I could easily introduce one if you wanted. Note that this doesn't try to parse numbers e.g. "12" like the built-in version does, nor does it try to parse comma-separated lists of flags. I may add the flags version later on, but I can't see much point in the numeric version.
This is done without boxing and without execution time type checking. Having the constraint is really handy :)
Please let me know if you'd find a case-insensitive parse useful...
如果您使用 .NET 3.5(甚至 2.0,如果您删除扩展方法),我对本文中的技术非常幸运:
枚举和字符串 - 停止疯狂!
编辑:域已经消失,现在是一个链接场。我在工作时从我们的代码库中提取了代码(稍作修改并随着时间的推移添加),您现在可以在这里找到:
https://gist.github.com/1305566
If you're using .NET 3.5 (or even 2.0, if you trim out the extension method), I've had great luck with the techniques in this article:
Enumerations and Strings - Stop the Madness!
EDIT: Domain is gone and is now a link farm. I pulled the code (slightly modified and added to over time) from our codebase at work, which you can now find here:
https://gist.github.com/1305566
如果您想避免使用 try/catch,可以使用
TryParse
。我对所选答案进行了一些修改。我希望你喜欢它。
You can use
TryParse
if you want to avoid using try/catch.I modified the selected answer a little bit. I hope you like it.
我刚刚组合了 此处,异常处理来自 此处,创建这个:
你可以稍微调整它以返回 null 而不是抛出异常。
I have just combined the syntax from here, with the exception handling from here, to create this:
You could twiddle it a bit to return null instead of throwing exceptions.
通过字符串返回 Enum,如果包含:
To return Enum by string, if contains: