从带有事件的XDocument返回值

本文关键字:XDocument 返回值 事件 | 更新日期: 2023-09-27 17:58:30

我写了一个类ReasXML,基本上是只读的XML文件。你看,我参与了一些活动。。现在的问题是我想要使用lsTags的结果,或者我想要我的XML文件的值。这样做的基本思想是:使函数成为LoadXMLFile和XMLFileLoaded方法的返回类型List。但我收到一个错误,返回类型错误。

有人能帮我吗?给我一个事件如何返回变量的例子?

提前感谢!

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;
        }
    }

从带有事件的XDocument返回值

事件处理程序可以是任何委托类型,而不仅仅是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 Design Pattern。如果使用此模式,则必须创建一个(或多个)具有Accept方法的访问者适配器