封装嵌套XML

时间:2010-11-25 05:47:16

标签: c# xml encapsulation

我正在尝试找到一种将XML封装到C#类中的优雅方法。环顾四周,我在某个地方发现了一个Java示例(不要问我在这一点上的位置)引发了一个想法,但我不确定它是否可能在C#中或者我是否以正确的方式进行。< / p>

我目前使用的不优雅方法是使用一系列嵌套的switch语句迭代XPathNodeIterator / XPathNavigator节点,这些语句指示找到相应节点后要执行的操作,并列出所有未处理的节点。我正在尝试的更优雅的方法涉及使用辅助类来执行大部分迭代,并且基本上采用节点名称以及遇到该节点时要采取的Action。那个班级目前看起来像这样(注意这是理论上的,见下面的原因):

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)并将其分配给外部变量或属性?

我对一般的代表来说还是新手,所以我不知道这是否可能。如果是的话,太好了!如果没有,我可以尝试其他任何优雅的解决方案吗?或者我应该坚持使用嵌套开关?

1 个答案:

答案 0 :(得分:4)

考虑使用Action<T>代替Action。可以使用参数调用它的Invoke方法。在你的情况下:

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

或者,如果您想分配任何外部值,可以使用Func<T1,T2>

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

顺便说一句,如第二个例子所示,可以省略直接调用呼叫。我们可以简单地将其称为方法