将枚举类型转换为静态“方法”

时间:2020-05-28 09:44:59

标签: c# casting

我正在使用枚举和xml文件。

因为xml总是返回字符串值,所以我需要将这些值转换为我的枚举值。

//while reading the xml file:
ItemType = xml.Element("ItemType") != null ?(ProjectTreeItemTypes)Enum.Parse(typeof(ProjectTreeItemTypes), elem.Element("ItemType").Value,true) : ProjectTreeItemTypes.None

我想对枚举实现始终为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

谢谢

3 个答案:

答案 0 :(得分:1)

您可以在静态类中创建扩展方法。


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();

答案 1 :(得分:1)

您可以为此编写扩展方法

public static class Ext
{
    public static ProjectTreeItemTypes ToItemType(this string value)
    {
        return value == null
            ? ProjectTreeItemTypes.None
            : (ProjectTreeItemTypes) Enum.Parse(typeof(ProjectTreeItemTypes), value, true);
    }
}

它将接受XElement.Valuestring并返回ProjectTreeItemTypes枚举

用法示例

ItemType = xml.Element("ItemType")?.Value.ToItemType() ?? ProjectTreeItemTypes.None;

由于您可以将null的值传递给扩展方法,因此可以使用null-conditional operator ?.简化null的检查

答案 2 :(得分:1)

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);