2011-06-07 83 views
0

我寫了一個類ReasXML的基本上只讀的XML文件。你看我與事件一起工作..現在問題是我想使用lsTags的結果,或者我想要我的XML文件的值。基本思想要做到這一點:使函數成爲方法LoadXMLFile和XMLFileLoaded的返回類型List。但是我收到一個錯誤,錯誤的返回類型。來自XDocument的事件返回值

有人可以幫助我這個給我一個事件的例子如何返回變量?

在此先感謝!

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

如果您的目標是從此Xml文件中獲取對象,您可能需要使用「XmlSerializer」來代替。它通常要求您編寫的代碼少於明確的DOM處理。 – 2011-06-07 18:05:20

+0

是的。它的導入是爲了知道這是一款Silverlight應用程序。我只想要關閉lsTags的值。我想,當我自己觸發一個事件時,我可以存儲這個值並進一步運行我自己的代碼。但它不起作用。我將刪除冗餘代碼。 – user 2011-06-07 18:14:08

回答

2

事件處理程序可以是任何委託類型,而不僅僅是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; 
    } 
} 

這段代碼的輸出:

多事件處理程序

請注意,您只會獲得所有事件處理程序返回的最後一個值。

如果您想以類似事件的方式處理多個返回值,您可能需要查看Visitor Design Pattern。如果您使用此模式,則必須創建一個訪問適配器(或訪客適配器),其中包含Accept方法。