我正在尝试找到一种将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)并将其分配给外部变量或属性?
我对一般的代表来说还是新手,所以我不知道这是否可能。如果是的话,太好了!如果没有,我可以尝试其他任何优雅的解决方案吗?或者我应该坚持使用嵌套开关?
答案 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);
顺便说一句,如第二个例子所示,可以省略直接调用呼叫。我们可以简单地将其称为方法