Estoy trabajando con una enumeración y archivos xml.

Como xml siempre devuelve valores de cadena, necesito convertir estos valores a mis valores de enumeración.

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

Me gustaría implementar algo como siempre avaialbel .toString () en mi enumeración. ¿Hay una manera de resolver esto?

El resultado debería tener este aspecto:

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

¿Es esto posible de alguna manera o similar?
Evene algo así como un elenco simple sería bueno:

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

Gracias

0
Telefisch 28 may. 2020 a las 12:44

3 respuestas

La mejor respuesta

Puede escribir un método de extensión para eso

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

Aceptará string, que es XElement.Value y devuelve ProjectTreeItemTypes enumeración

El ejemplo de uso

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

Como puede pasar un valor null al método de extensión, su verificación null se puede simplificar usando operador nulo-condicional ?.

1
Pavel Anikhouski 28 may. 2020 a las 10:16

Puede crear un método de extensión en una clase estática.


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
    }
}

Y luego podrás usarlo así:

xml.ToEnum();
1
Ygalbel 28 may. 2020 a las 09:53

Cree una extensión para XmlElement que sea una envoltura alrededor de Enum.Parse:

static TEnum ParseEnum <TEnum>(this XmlElement element) where TEnum : struct, Enum
{
    return Enum.Parse<TEnum>(element.Value);
}

Luego use como:

ItemType = xml.Element("ItemType")?.ParseEnum<ProjectTreeItemTypes>() ?? ProjectTreeItemTypes.None;

O puede hacer que la extensión sea responsable de devolver el valor predeterminado:

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

Uso:

ItemType = xml.Element("ItemType").TryParseEnum(ProjectTreeItemTypes.None);
1
Johnathan Barclay 28 may. 2020 a las 10:07