簡體   English   中英

C# LINQ to XML:來自 XElement 的“安全”枚舉值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM