c# LINQ到XML: "安全"来自XElement的enum值

本文关键字:quot XElement enum 来自 安全 LINQ XML | 更新日期: 2023-09-27 18:08:09

要在c#中从XElement中获得一个"安全"的整数值,可以使用如下方法

    public int GetIntegerValue(XElement x, string tag)
    {
        int result  = Int32.MinValue;
        if (x.Element(tag) != null)
        {
            Int32.TryParse(x.Element(tag).Value, out result);
        }
        return result;
    }

如果元素存在并且包含可解析字符串,则代码返回正确的整数值,否则返回Int32.MinValue。这种方法可以用于其他一些常见类型,如double、bool等,但是enum呢?

也可以有一个函数像GetEnumValue(XElement x,字符串标签,类型enumType)或GetEnumValue(XElement x,字符串标签,TEnum defaultValue)或类似的?

c# LINQ到XML: "安全"来自XElement的enum值

您可以尝试以下方法:

public static TEnum GetEnumValue<TEnum>(XElement x, string tag)
    where TEnum : struct
{
    // Set default value
    TEnum parsedEnum = default(TEnum);
    var element = x.Element(tag);
    if(element != null)
    {
        // Try to parse
        Enum.TryParse<TEnum>(element.Value, out parsedEnum);
    }
    return parsedEnum;
}

然后命名为:

CarType carType = GetEnumValue<CarType>(xElement, tag);

可以将ENUM强制转换为整数。也可以使用。tostring()来帮助识别枚举类型。

试试下面的代码-它非常快,但它确实有效。

using System;
using System.Xml;
using System.Xml.Linq;
public class Program
{
    public enum testTypes { test1, test2, test3};

    private static testTypes GetEnumValue(XElement x, string tag)
    {
        if (x.Element(tag)!=null) {
            var v = x.Element(tag).Value.ToString();
            var testEnums = Enum.GetValues(typeof(testTypes));
            foreach (testTypes enumType in testEnums) {
                if (v.Equals((testTypes) enumType)) return enumType;
            }
        }
        return (testTypes) 0;
    }
    public static void Main()
    {
        XElement x = new XElement("MyType","Test1");
        var EnumVal = GetEnumValue(x, "MyType");    
        Console.WriteLine("Type is {0}",(testTypes) EnumVal);
    }
}

实际上你可以使用泛型来泛化这个方法,而不是使用静态的方法。

使用以前的Adil,还可以创建如下扩展函数:

public static TEnum ToEnumValue<TEnum>(this XElement xelem)
        where TEnum : struct
    {
        if (xelem is null)
        {
            throw new ArgumentNullException(nameof(xelem));
        }
        Enum.TryParse<TEnum>(xelem.Value, out TEnum parsedEnum);
        return parsedEnum;
    }

则可以这样使用:

MyViewModel.Mode = node.Element("MyMode")?.ToEnumValue<ModeEnum>() ?? ModeEnum.Mode1;