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)或类似的?
您可以尝试以下方法:
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;