[英]C# LINQ to XML: "Safe" enum value from an XElement?
要從 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, string tag, Type enumType) 或 GetEnumValue(XElement x, string tag, 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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.