-
-
Save JeffreyZhao/5ab9961fc8b2454a4531 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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