我希望看到使用的领域之一dynamic
是XML。我认为这将使 XML 处理代码编写起来更简单,并且我相信在 C# 4 出现之前我看到了一些示例,并且提到了它在这个答案中 https://stackoverflow.com/questions/2255982/c-4-real-world-example-of-dynamic-types/2256051#2256051作为此功能的用途之一。
所以,我的问题是:为什么不XmlDocument
(or XDocument
) 变得动态,或者为什么 C# 4 中没有一些用于动态 XML 操作的新类?
这对我来说更奇怪,当我在 PowerShell 中考虑时,XmlDocument
是动态的,代码如下$xmlDoc.root.subnode.subsubnode
在那里工作。
我对大量看似权威的讨论却没有答案感到惊讶。你的问题太棒了。它准确地解决了那些令人敬畏的事情dynamic
关键字的目的是。问题是,没有多少人真正知道如何充分利用它。
虽然 MS 没有为我们构建动态 XML 对象,但他们确实为我们提供了工具,让我们可以使用动态对象 http://haacked.com/archive/2009/08/26/method-missing-csharp-4.aspx班级。这是一种方法来满足您对旧设备的要求XmlDocument
class.
public class DynamicXmlElement : DynamicObject {
XmlElement _xmlEl;
public DynamicXmlElement(string xml) {
var xmldoc = new XmlDocument();
xmldoc.LoadXml(xml);
_xmlEl = xmldoc.DocumentElement;
}
public DynamicXmlElement(XmlElement el) {
_xmlEl = el;
}
public override bool TrySetMember(SetMemberBinder binder, object value) {
return false;
}
public override bool TryGetMember(GetMemberBinder binder, out object result) {
XmlElement el = (XmlElement)_xmlEl.SelectSingleNode(binder.Name);
if (el != null) {
// wrap the element we found in a new DynamicXmlElement object
result = new DynamicXmlElement(el);
return true;
}
else if (binder.Name == "root") {
// special case for handling references to "root"
result = new DynamicXmlElement(_xmlEl.OwnerDocument.DocumentElement);
return true;
}
else {
// feel free to change this to prevent having accidental null reference issues
// by just setting the result to a DynamicXmlElement with a null element and
// handling _xmlEl == null at the start of this method
result = null;
return false;
}
}
public override string ToString() {
return _xmlEl.InnerText;
}
}
以下是调用代码的方式。请注意,这仅在 C# 4.0 中编译。
namespace ConsoleApplication4 {
class Program {
static void Main(string[] args) {
var xmlstr = "<r><subnode><subsubnode>ABCs of dynamic classes</subsubnode></subnode></r>";
dynamic xml = new DynamicXmlElement(xmlstr);
Console.WriteLine(xml.subnode.root.subnode.subsubnode); // take the long way around...
Console.ReadKey(true);
}
}
}
我不能把这一切归功于我。斑竹写了这段代码 http://svn.boo.codehaus.org/browse/boo/trunk/examples/duck-typing/XmlObject.boo?r=1231Boo 早在 2003 年就出现了。C# 已经慢慢获得了 Boo 多年来在 .NET 中所拥有的功能……首先是类型推断,现在是 IQuackFu 风格DynamicObject
。一旦他们实现了语言宏以便你可以制作 DSL,我认为他们就会迎头赶上。
我将把这段代码的更新样式的 XElement 版本留给读者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)