2016-09-22 2 views
-1

Для того, чтобы получить «безопасное» целое значение от XElement в C# можно использовать метод, какC# LINQ to XML: «безопасное» значение перечисления из 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 и т. Д., Но как насчет перечисления?

Может ли быть такая функция, как GetEnumValue (XElement x, строковый тег, тип enumType) или GetEnumValue (XElement x, строковый тег, TEnum defaultValue) или аналогично?

ответ

1

Вы можете попробовать следующий метод:

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); 
+0

Спасибо, Adil, он функционирует! –

+0

@AlexKonnen, я рад, что это помогло. Но не забудьте принять как ответ, он работает для вас –

+0

Adil, я бы с нетерпением этого дела, просто скажите мне, как (я не мог отправить вам письмо) –

1

Вы можете разыгрывать 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); 

    } 
} 

Фактически вы можете использовать Generics для обобщения подхода вместо использования статического метода.

+0

Я вижу, что Адил сделал гораздо лучшую работу! –

Смежные вопросы