Реализовать преобразование перечисляемых типов как stati c "метод" - PullRequest
0 голосов
/ 28 мая 2020

Я работаю с перечислением и 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 () в моем перечислении. Есть ли способ решить эту проблему? 1006 1012 *

ItemType = xml.Element("ItemType") != null ? (ProjectTreeItemTypes)elem.Element("ItemType").Value : ProjectTreeItemTypes.None

Спасибо

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вы можете написать метод расширения для этого

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 enum

Пример использования

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

Поскольку вы можете передать значение null методу расширения, ваша проверка null может быть упрощена с помощью условного оператора ?.

1 голос
/ 28 мая 2020

Создайте расширение для 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);
1 голос
/ 28 мая 2020

Вы можете создать метод расширения в классе c stati.


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