二十行C#代码打造Ruby Markup Builder
2010-09-30 21:05:26 来源:WEB开发网但是我们这些可怜的C#程序员难道只有在一边眼馋的份吗?不见得,我们也可以来“享受”一把:
dynamic b = new XmlMarkupBuilder();
XElement xml =
b.persons(
b.person("Tom", age: 10),
b.person("Jerry", age: 8));
哇,这是什么,怎么代码那么简单。很明显,从dynamic关键字上可以看出,这是C# 4.0中新增的功能。您可能会想“原来.NET 4.0对XML又有增强了”……其实并非如此,这是我们自己扩展的功能。不过这应该算是更好的消息,因为这说明我们已经有能力自行扩展,自行设计这样的 API了——这可是“渔”,比“鱼”可要值钱多了。而实现这样的功能也只需要短短二十几行C#代码:
public class XmlMarkupBuilder : DynamicObject
{
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
XElement xml = new XElement(binder.Name);
var attrCount = binder.CallInfo.ArgumentNames.Count;
var elementCount = args.Length - attrCount;
for (int i = 0; i < elementCount; i++)
{
xml.Add(args[i]);
}
for (var i = 0; i < attrCount; i++)
{
var attrName = binder.CallInfo.ArgumentNames[i];
if (attrName[0] == '@') attrName = attrName.Substring(1);
xml.Add(new XAttribute(attrName, args[i + elementCount]));
}
result = xml;
return true;
}
}
更多精彩
赞助商链接