Skip to content

Instantly share code, notes, and snippets.

@JeffreyZhao
Created October 26, 2009 09:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JeffreyZhao/5ab9961fc8b2454a4531 to your computer and use it in GitHub Desktop.
Save JeffreyZhao/5ab9961fc8b2454a4531 to your computer and use it in GitHub Desktop.
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;
}
}
class Program
{
static void Main(string[] args)
{
dynamic b = new XmlMarkupBuilder();
XElement xml =
b.Persons(
b.Person("Tom", age: 10),
b.Person("Jerry", age: 8));
Console.WriteLine(xml);
// output:
// <Persons>
// <Person age="10">Tom</Person>
// <Person age="8">Jerry</Person>
// </Persons>
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment