我试图找到一种将XML封装到C#类中的优雅方法。环顾四周,我在某个地方找到了一个Java示例(现在不问我在哪里),这激发了一个主意,但是我不确定C#中是否有可能,或者我是否正在以正确的方式进行操作。

我当前使用的优雅方法是使用一系列嵌套的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)并将其分配给外部变量或属性?

总的来说,我对代表们仍然真的很陌生,所以我不知道这是否有可能。如果是这样,那就太好了!如果没有,我可以尝试其他优雅的解决方案吗?还是我应该坚持使用嵌套开关?

最佳答案

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

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


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

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


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

10-07 22:20