2010-11-25 49 views
1

我試圖找到一種將XML封裝到C#類的優雅方式。環顧四周,我發現了一個Java示例(不要問我在哪裏)引發了一個想法,但我不確定在C#中甚至有可能以正確的方式開展工作。封裝嵌套的XML

我目前使用的那種不雅的方法是通過XPathNodeIterator/XPathNavigator節點遍歷一系列嵌套的switch語句,這些語句指示找到合適的節點後該怎麼做,還列出了未處理的任何節點。我嘗試的更優雅的方法涉及使用助手類來完成迭代的大部分,並且基本上需要一個節點名稱以及在遇到該節點時執行的操作。這個類看起來像目前這樣(注意,這是理論上的,請參閱以下原因):

class XmlNodeIterator 
{ 
    public XmlNodeIterator(XPathNodeIterator node, Dictionary<string, Action> children) 
    { 
     foreach (XPathNavigator childNode in node.Current.SelectChildren(XPathNodeType.Element)) 
     { 
      Action child = null; 
      try 
      { 
       child = children[childNode.LocalName]; 
      } 
      catch (KeyNotFoundException e) 
      { 
       // Log the warning in some fashion 
      } 
      if (child != null) 
       child.Invoke(); 
     } 
    } 
} 

之前,我甚至驗證的概念測試,我發現了一個問題的理念。 :)如何訪問委託函數中的內部childNode(例如,childNode.Value或childNode.GetAttribute)並將其分配給外部變量或屬性?

對於代表們來說,我還是很新的,所以我不知道這是否可能。如果是,太棒了!如果沒有,我還可以嘗試其他優雅的解決方案嗎?或者我應該堅持嵌套開關?

回答

4

考慮使用Action<T>而不是Action。它的Invoke方法可以用參數調用。你的情況:

Action<XPathNavigator> child = null; 
... 
child.Invoke(childNode); 

或者,如果你想分配任何外在價值,你可以使用Func<T1,T2>這樣的:

Func<XPathNavigator, string> child = null; 
... 
var value = child(childNode); 

順便說一下,如圖2日例如,直接調用呼叫可以被遺漏。我們可以簡單地稱之爲方法

+0

這就是我一直在尋找的東西,現在我已經掌握了它,看起來這個概念也會起作用。謝謝! – RobinHood70 2010-11-25 07:26:43