2010-11-25 16 views
1

私はC#クラスにXMLをカプセル化する洗練された方法を見出そうとしています。周りを見回すと、どこかでJavaのサンプルが見つかりました(この時点でどこに問い合わせても構いません)が、アイデアを発しましたが、C#でも可能であるかどうか、あるいは正しい方法を考えているかどうかはわかりません。ネストされたXMLをカプセル化

私は現在、適切なノードが見つかると何をすべきかを示す一連のネストされたswitch文を持つXPathNodeIterator/XPathNavigatorノードを繰り返し、未処理のノードもリストします。私が試しているより洗練されたメソッドは、ヘルパークラスを使用して反復の大部分を行い、基本的にノード名とそのノードに遭遇したときに取るアクションを取ります。そのクラスは現在この(理由は下記を参照してください、これは理論的であることに注意してください)のようになります。私も概念実証のテストになった前

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の代わりにAction<T>を使用することを検討してください。 Invokeメソッドはパラメータで呼び出すことができます。

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

それとも、任意の外側の値を割り当てたい場合は、そのようなFunc<T1,T2>を使用することができます:あなたのケースでは第二の例に示すように、

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

ところで、直接呼び出しコールは属性を省略してもかまいませ。

+0

これは私が探していたものでしたが、今ではそれを実現しているので、コンセプトもうまくいくように見えます。ありがとう! – RobinHood70

+0

FxCopはDictionary >のネストされたジェネリックについて覚えています。今のところ、私はただそれを残しています。 – RobinHood70

+0

私は助けてくれてうれしい)幸運。 – ILya

関連する問題