#.net #c#-4.0
#.net #c #-4.0
Вопрос:
Я хотел преобразовать XML-файл, мне пришлось вернуть мне список анонимных типов, поэтому у меня есть что-то вроде этого:
<Input name="MyProperty" datatype="string">a</Input>
<Input name="SecondProperty" datatype="IPAddress">b</Input>
<Input name="ThirdProperty" datatype="int">c</Input>
и хотел, чтобы он был преобразован в формат, как показано ниже:
select new
{
MyProperty=a,
SecondProperty=b,
ThridProperty=c,
}
Возможно ли это сделать?Идея состоит в том, чтобы вернуть список этих входных данных для ввода в
другой метод.Также что-нибудь не так в этом способе?
спасибо, любая помощь приветствуется
Ответ №1:
Если вы заранее знаете название свойств, вы можете это сделать:
XElement doc = ...
var obj = new
{
MyProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "MyProperty").Value,
SecondProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "SecondProperty").Value,
ThirdProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "ThirdProperty").Value
}
Если вы не знаете имена, вы не сможете использовать анонимный тип. Анонимные типы — это действительно обычные типы без имени, их члены объявляются статически.
Комментарии:
1. Я надеялся сгенерировать имя для анонимного типа из имени атрибута xml для тега name … это может сработать?
2. Нет, потому что содержимое XML не будет известно до времени выполнения. Члены анонимных типов должны быть известны во время компиляции… В любом случае, как бы вы использовали свойства анонимного типа, если вы не знаете их имена заранее? Словарь, вероятно, был бы более подходящим для ваших нужд
3. спасибо Томасу за ваш вклад … но проблема в том, что я хочу загрузить коллекцию этих входных данных во время выполнения, и они варьируются от ввода к вводу. Я надеялся, что есть способ вернуть список анонимных типов на основе родительского входного тега.
Ответ №2:
Возможно, это не то решение, которое вы ищете, но просто хотели использовать его там…
Что-то, что я нашел полезным при работе с XML, — это оформление класса сериализуемым attribute…it упростить сериализацию в XML и из XML. http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx Вы можете дополнительно манипулировать выводом, чтобы получить нужный вам формат XML.
Редактировать, чтобы ответить вы отвечаете на свой вопрос о различных свойствах, которые могут не представлять интереса, но вот что можно было бы сделать:
[Serializable]
public struct SerializableKeyValuePair<TKey, TValue>
{
public TKey Key { get; set; }
public TValue Value { get; set; }
}
[Serializable]
public class Input
{
public List<SerializableKeyValuePair<string, string>> PropertyBag { get; set; }
}
Однако у вас не будет такого большого контроля, поскольку все свойства должны быть атрибутом ИЛИ элементом, представленным в XML.
Комментарии:
1. дело в том, что у меня будет переменный список входных данных, поэтому я надеялся создать динамический тип вместо статических объектов
2. @TommyTwist пока структура входных данных одинакова, вы сможете с легкостью сериализовать весь список (например, List<Ввод>).
3. @TommyTwist вот руководство по этому вопросу на случай, если это вас заинтересует. switchonthecode.com/tutorials/csharp-tutorial-xml-serialization
4. спасибо за ввод, но количество свойств может отличаться, поэтому десериализация с использованием обычных средств невозможна … если только не существует способа десериализации xml-файла без создания типа для сериализации
5. @TommyTwist Я отредактировал ответ, чтобы добавить больше информации … хотя я не предлагаю вам добавлять это, если это не соответствует вашим потребностям. Удачи!