Разбор XML с использованием LINQ и заполнение существующих свойств объекта, а не создание нового - PullRequest
2 голосов
/ 09 декабря 2010

Теперь у меня есть следующий код:

Tutorial tutorial =
  (from tutorial in xmlDoc.Descendants("Tutorial")
   select new Tutorial
   {
     Author = tutorial.Element("Author").Value,
     Title = tutorial.Element("Title").Value,
     Date = DateTime.Parse(tutorial.Element("Date").Value),
   }).First();

myTutorial.Author = tutorial.Author;
myTutorial.Title = tutorial.Title;
myTutorial.Date = tutorial.Date;

myTutorial передается из другого метода.И код ниже должен «заполнить» его.

Вопрос заключается в следующем: есть ли способ создать запрос LINQ, который будет присваивать значения свойств существующего объекта, а не создавать новый.

Мне нужен мой кодчтобы выглядеть примерно так:

   Tutorial tutorial =
  (from tutorial in xmlDoc.Descendants("Tutorial")
   select myTutorial
   {
     Author = tutorial.Element("Author").Value,
     Title = tutorial.Element("Title").Value,
     Date = DateTime.Parse(tutorial.Element("Date").Value),
   });

Проблема, с которой я столкнулся, такова: У меня есть объект, для которого изначально настроена только половина его свойств, позже мне нужно заполнить оставшуюся частьсвойства.Это необходимо сделать асинхронно.

Мой подход: Я использую асинхронный метод WebClient DownloadStringAsync для загрузки XML-файла.В обработчике событий я не хочу заполнять объект теми свойствами, которые он пропускает.И именно поэтому я хотел бы напрямую передавать значения своему объекту, а не создавать новый.

Пожалуйста, дайте мне знать, если это не лучший подход.

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

ОК, это чистое зло:

var dropThis =
  (from tutorial in xmlDoc.Descendants("Tutorial")
   select new
   {
     Author = (myTutorial.Author = (string)tutorial.Element("Author")),
     Title = (myTutorial.Title = (string)tutorial.Element("Title")),
     Date = (myTutorial.Date = (DateTime)tutorial.Element("Date")),
   }).First();
0 голосов
/ 10 декабря 2010

Я заметил этот вопрос и почувствовал необходимость добавить еще одно грязное решение.Как насчет методов расширения?

public static void AddTo(this IEnumerable<Tutorial> source, Tutorial projection)
{
    if (source.Count() == 0)
        return;

    projection.Title = source.First().Title;
    projection.Author = source.First().Author;
    projection.Date = source.First().Date;
}

Теперь вы можете просто позвонить, чтобы добавить к своему текущему учебнику.Кроме того, я рекомендую использовать (строку) вместо .Value, чтобы избежать исключений нулевой ссылки.

tutorialXml
    .Descendants("Tutorial")
    .Select(tutorial => new Tutorial
         {
             Author = (string) tutorial.Element("Author"),
             Title = (string) tutorial.Element("Title"),
             Date = DateTime.Parse((string) tutorial.Element("Date")),
         })
    .AddTo(myTutorial);

В любом случае, удачи.Просто хотел добавить грязное решение к этому шарику грязи.

0 голосов
/ 09 декабря 2010

Функциональные запросы LINQ фактически разработаны таким образом, что они не должны изменять существующие объекты или коллекции, то есть сохранять состояние (хотя существуют способы (хаки?) Для этого).

Но вы можете довольно легко реализовать метод, основанный на отражении, для достижения того, чего вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...