9.8.2018.0630
大石头 编写于 2018-06-30 11:15:32
X
using System;
using System.Dynamic;
using System.Xml.Linq;

namespace NewLife.Reflection
{
    /// <summary>动态Xml</summary>
    public class DynamicXml : DynamicObject
    {
        /// <summary>节点</summary>
        public XElement Node { get; set; }

        /// <summary>实例化</summary>
        public DynamicXml() { }

        /// <summary>实例化</summary>
        /// <param name="node"></param>
        public DynamicXml(XElement node)
        {
            Node = node;
        }

        /// <summary>实例化</summary>
        /// <param name="name"></param>
        public DynamicXml(String name)
        {
            Node = new XElement(name);
        }

        /// <summary>设置</summary>
        /// <param name="binder"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public override Boolean TrySetMember(SetMemberBinder binder, Object value)
        {
            var setNode = Node.Element(binder.Name);
            if (setNode != null)
                setNode.SetValue(value);
            else
            {
                if (value.GetType() == typeof(DynamicXml))
                    Node.Add(new XElement(binder.Name));
                else
                    Node.Add(new XElement(binder.Name, value));
            }
            return true;
        }

        /// <summary>获取</summary>
        /// <param name="binder"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        public override Boolean TryGetMember(GetMemberBinder binder, out Object result)
        {
            result = null;
            var getNode = Node.Element(binder.Name);
            if (getNode == null) return false;

            result = new DynamicXml(getNode);
            return true;
        }

#if DEBUG
        /// <summary>测试</summary>
        public static void Test()
        {
            dynamic xml = new DynamicXml("Test");
            xml.Name = "NewLife";
            xml.Sign = "学无先后达者为师!";
            xml.Detail = new DynamicXml();
            xml.Detail.Name = "新生命开发团队";
            xml.Detail.CreateTime = new DateTime(2002, 12, 31);

            var node = xml.Node as XElement;
            var str = node.ToString();
            Console.WriteLine(str);
        }
#endif
    }
}