![](/img/trans.png)
[英]Why do C# enum types not need to be declared static when used in a static method?
[英]Implement conversion of enum types as static “method”
我正在使用枚举和 xml 文件。
因为 xml 总是返回字符串值,所以我需要将这些值转换为我的枚举值。
//while reading the xml file:
ItemType = xml.Element("ItemType") != null ?(ProjectTreeItemTypes)Enum.Parse(typeof(ProjectTreeItemTypes), elem.Element("ItemType").Value,true) : ProjectTreeItemTypes.None
我想在我的枚举中实现类似 always avaialbel.toString() 的东西。 有没有办法解决这个问题?
结果应如下所示:
ItemType = xml.Element("ItemType") != null ? elem.Element("ItemType").Value.toItemType() : ProjectTreeItemTypes.None
这可能以某种方式或类似的方式吗?
甚至像简单演员这样的东西会很好:
ItemType = xml.Element("ItemType") != null ? (ProjectTreeItemTypes)elem.Element("ItemType").Value : ProjectTreeItemTypes.None
谢谢
您可以在 static class 中创建扩展方法。
public static class Extentsion
{
public static ProjectTreeItemTypes ToEnum(this XElement elem)
{
return elem.Element("ItemType") != null ?
(ProjectTreeItemTypes)Enum.Parse(typeof(ProjectTreeItemTypes), elem.Element("ItemType").Value,true) : ProjectTreeItemTypes.None
}
}
然后你就可以像这样使用它了:
xml.ToEnum();
您可以为此编写扩展方法
public static class Ext
{
public static ProjectTreeItemTypes ToItemType(this string value)
{
return value == null
? ProjectTreeItemTypes.None
: (ProjectTreeItemTypes) Enum.Parse(typeof(ProjectTreeItemTypes), value, true);
}
}
它将接受string
,即XElement.Value
并返回ProjectTreeItemTypes
枚举
使用示例
ItemType = xml.Element("ItemType")?.Value.ToItemType() ?? ProjectTreeItemTypes.None;
由于您可以将null
值传递给扩展方法,因此可以使用空条件运算符?.
简化您的null
检查。
为XmlElement
创建一个扩展,它是Enum.Parse
的包装器:
static TEnum ParseEnum <TEnum>(this XmlElement element) where TEnum : struct, Enum
{
return Enum.Parse<TEnum>(element.Value);
}
然后像这样使用:
ItemType = xml.Element("ItemType")?.ParseEnum<ProjectTreeItemTypes>() ?? ProjectTreeItemTypes.None;
或者你可以让扩展负责返回默认值:
static TEnum TryParseEnum <TEnum>(this XmlElement element, TEnum defaultValue) where TEnum : struct, Enum
{
if (Enum.TryParse<TEnum>(element.Value, out var val))
{
return val;
}
return defaultValue;
}
用法:
ItemType = xml.Element("ItemType").TryParseEnum(ProjectTreeItemTypes.None);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.