Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class X : DynamicObject
- {
- List<XElement> xsiblings = new List<XElement>();
- XElement xwrapper;
- XElement xplace;
- Dictionary<string, Func<X>> customOperators = new Dictionary<string, Func<X>>();
- private Func<X> Down
- {
- get { return () => new X(xplace) { xplace = xplace }; }
- }
- private Func<X> Up
- {
- get
- {
- var parent = xplace.Parent ?? xplace;
- parent = parent.Parent ?? parent;
- return () => new X(parent) { xplace = xplace.Parent };
- }
- }
- private Func<X> Self
- {
- get { return () => new X(this); }
- }
- public static dynamic _{ get { return New; } }
- public static dynamic New
- {
- get
- {
- Func<dynamic> exp = () =>
- {
- var b = new X();
- return (dynamic)b;
- };
- return exp.Invoke();
- }
- }
- protected void init()
- {
- customOperators.Add(">", () => Down());
- customOperators.Add("<", () => Up());
- customOperators.Add("+", () => Self());
- customOperators.Add("_", () => _);
- }
- public X(){
- xwrapper = new XElement("Wrapper");
- xplace = xwrapper;
- init();
- }
- public X(XElement xelem)
- {
- xwrapper = xelem;
- xplace = xwrapper.Descendants().LastOrDefault() ?? xwrapper;
- init();
- }
- public X(X builder)
- {
- xwrapper = builder.xwrapper;
- xplace = xwrapper.Descendants().LastOrDefault() ?? xwrapper;
- init();
- }
- public X(X builder1, X builder2)
- {
- builder1.xplace.Add(builder2.xwrapper);
- builder2.xplace = builder1.xplace;
- init();
- }
- public override string ToString()
- {
- return xwrapper.ToString();
- }
- public static X operator +(X c1, X c2)
- {
- c1.xwrapper.Add(c2.xwrapper.Descendants());
- return c1;
- }
- public static X operator >(X c1, X c2)
- {
- var xlast = c1.xplace.Descendants().LastOrDefault();
- xlast = xlast ?? c1.xplace;
- xlast.Add(c2.xwrapper.Descendants());
- return c1;
- }
- public static X operator <(X c1, X c2)
- {
- var xlast = c1.xplace.Parent.Descendants().LastOrDefault();
- xlast = xlast ?? c1.xplace;
- var parent = xlast.Parent ?? xlast;
- parent = parent.Parent ?? parent;
- parent.Add(c2.xwrapper.Descendants());
- return c1;
- }
- public override bool TryInvoke(InvokeBinder binder, object[] args, out object result)
- {
- return base.TryInvoke(binder, args, out result);
- }
- public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
- {
- result = default(object);
- if (customOperators.ContainsKey(binder.Name))
- result = customOperators[binder.Name]();
- else //build with this call
- {
- var work = new Func<object>(() =>
- {
- var diff = args.Count() - binder.CallInfo.ArgumentNames.Count;
- var innerText = string.Empty;
- var argQueue = new Queue<object>(args);
- if (diff > 0)
- diff.Times(i => innerText += argQueue.Dequeue().ToString());
- args = argQueue.ToArray();
- var parameters = new Dictionary<string, object>();
- binder.CallInfo.ArgumentNames.Count().Times(i =>
- {
- parameters.Add(binder.CallInfo.ArgumentNames[i], args[i]);
- });
- XElement xelem = new XElement(binder.Name,
- parameters.ToList().Select(param => new XAttribute(param.Key, param.Value)));
- xelem.Add(innerText);
- xplace = xelem;
- return xelem;
- });
- var output = work.DynamicInvoke() as XElement;
- xwrapper.Add(output);
- result = this;
- }
- return true;
- }
- public X this[string key]
- {
- get { return customOperators[key](); }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement