2015-07-26 3 views
1

Я хочу написать обобщенный метод, который возвращает XML после передачи коллекции типа T. Я пробовал код ниже, но не работает должным образом. Любые рекомендации по повышению этого, чтобы включить атрибуты элементов, высоко оценены. БлагодаряПреобразование общей коллекции в XML в C#

public XElement GetXElements<T>(IEnumerable<T> colelction,string parentNodeName) where T : class 
{    
    XElement xml = new XElement(typeof(T).GetType().Name); 
    foreach(var x in typeof(T).GetProperties()) 
    { 
     var name = x.Name; 
     var value = typeof(T).GetProperty(x.Name).GetValue(x); 
     xml.Add(new XElement(name,value)); 
    }   
    return xml; 
} 

Например, если я посылаю коллекцию как ниже описанным выше способом,

 var col = new List<Employee>() 
     { 
      new Employee 
      { 
       FirstName = "John", 
       Sex= "Male" 
      }, 
      new Employee 
      { 
       FirstName = "Lisa", 
       Sex= "Female" 
      }, 
     }; 

и вызвать метод, как GetXElements<Employee>(col,"Employees") я ожидаю получить XML, как показано ниже

<?xml version="1.0" encoding="utf-8"?> 
<Employees> 
    <Employee> 
    <FirstName>John</FirstName> 
    <Sex>Male</Sex> 
    </Employee> 
    <Employee> 
    <FirstName>Lisa</FirstName> 
    <Sex>Female</Sex> 
    </Employee> 
<Employees> 
+0

Ваш метод только имеет один параметр - почему вы проходящее два аргумента? –

+1

Почему вы не используете сериализацию? – whymatter

+0

http://stackoverflow.com/questions/781442/serialize-object-to-xmldocument –

ответ

1

Я не думаю, что вы поняли, что должно быть аргументом PropertyInfo.GetValue - это должно быть цель of t это свойство fetch, тогда как вы проходите в самом PropertyInfo.

Кроме того, ваш метод имеет только один параметр, тогда как вы пытаетесь передать два аргумента. Я думаю, что вы хотите что-то вроде этого:

public static XElement GetXElements<T>(IEnumerable<T> collection, string wrapperName) 
    where T : class 
{ 
    return new XElement(wrapperName, collection.Select(GetXElement)); 
} 

private static XElement GetXElement<T>(T item) 
{ 
    return new XElement(typeof(T).Name, 
     typeof(T).GetProperties() 
       .Select(prop => new XElement(prop.Name, prop.GetValue(item, null)); 
} 

Это дает результат, который вы ищите. Обратите внимание, что вам не нужно указывать тип аргумента при вызове GetXElement, так как определение типа будет делать правильные вещи:

XElement element = GetXElements(col,"Employees"); 
+0

Спасибо, Jon, ваше решение работало как шарм! – Rasika

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