Вернуть значения из XDocument с событиями - PullRequest
0 голосов
/ 07 июня 2011

Я написал класс ReasXML в основном для чтения только XML-файлов. Видите ли, я работал с событиями. Теперь проблема в том, что я хочу использовать результат lsTags или мне нужны значения моего файла XML. Основная мысль сделать это: сделать функцию возвращаемым типом List для методов LoadXMLFile и XMLFileLoaded. Но я получаю сообщение об ошибке, неправильный тип возврата.

Может ли кто-нибудь помочь мне с этим, приведите пример с событиями, как вернуть переменные?

Заранее спасибо!

public void LoadXMLFile() {
        WebClient xmlClient = new WebClient();
        xmlClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(XMLFileLoaded);
        xmlClient.DownloadStringAsync(new Uri("codeFragments.xml", UriKind.RelativeOrAbsolute));
    }
    protected void XMLFileLoaded(object sender, DownloadStringCompletedEventArgs e) {
        if (e.Error == null) {
            string xmlData = e.Result;
            XDocument xDoc = XDocument.Parse(xmlData);
            var tagsXml = from c in xDoc.Descendants("Tag") select c.Attribute("name");
            List<Tag> lsTags = new List<Tag>();

            foreach (string tagName in tagsXml) {
                Tag oTag = new Tag();
                oTag.name = tagName;
                var tags = from d in xDoc.Descendants("Tag")
                           where d.Attribute("name").Value == tagName
                           select d.Elements("oFragments");
                var tagXml = tags.ToArray()[0];

                foreach (var tag in tagXml) {
                    CodeFragments oFragments = new CodeFragments();
                    oFragments.tagURL = tag.Attribute("tagURL").Value;
                    oTag.lsTags.Add(oFragments);
                }
                lsTags.Add(oTag);
            }
            //List<string> test = new List<string> { "a","b","c" };
            lsBox.ItemsSource = lsTags;
        }
    }

1 Ответ

2 голосов
/ 07 июня 2011

Обработчики событий могут быть любого типа делегата, а не просто EventHandler.

Если вы хотите вернуть результат, просто измените событие на использование

Func<CustomEventArgs, YourReturnType>

Вот примеркод:

using System;

class Program
{
    public class Ev
    {
        public int? RaiseSomeEvent()
        {
            if (SomeEvent != null)
            {
                return SomeEvent();
            }

            return null;
        }

        public event Func<int> SomeEvent;
    }

    static void Main(string[] args)
    {
        var ev = new Ev();
        ev.SomeEvent += ev_someEvent1;
        ev.SomeEvent += ev_someEvent2;
        int? value = ev.RaiseSomeEvent();
        Console.WriteLine(value.HasValue ? value.Value.ToString() : "(null)");
    }

    static int ev_someEvent1()
    {
        return 5;
    }

    static int ev_someEvent2()
    {
        return 6;
    }
}

Вывод этого кода:

6

Несколько обработчиков событий

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

Если вы хотите обрабатывать несколько возвращаемых значений в некотором смысле, похожем на событие, вы можете проверить VisitorШаблон дизайна вместо.Если вы используете этот шаблон, вам придется создать адаптер для посетителей (или адаптеры для посетителей), в котором есть методы Accept.

...