dynamic 使用

            dynamic a = new { A = 1, B = 2 };
            Console.WriteLine("a.A=" + a.A);

            dynamic b = new Dictionary<string,int>();
            b["A"] = 6;
            Console.WriteLine("b[\"A\"]=" + b["A"]);
            //Following opration is not supported
            //b.A=6;
            //Console.WriteLine("b[\"A\"]=" + b.A);

            var c = func();
            Console.WriteLine("c[0].A=" + c[0].A);
            //Access c[0].UnknowProperty will cause a RuntimeBinderException

            dynamic test = new TestClass();
            test.P1 = 34;
            test.P2 = func();
            Console.WriteLine("test.P1=" + test.P1);
            Console.WriteLine("test.P2[1].B=" + test.P2[1].B);

        static dynamic[] func()
        {
            return new dynamic[]{new
            {
                A = 124,
                B = 345
            },new
            {
                A = 2345,
                B = 890
            }};
        }

    public class TestClass
    {
        public int P1 { get; set; }

        public dynamic P2 { get; set; }
    }
    [Serializable]
    public class DynamicObject : IDynamicMetaObjectProvider
    {
        protected DynamicObject();

        public virtual IEnumerable<string> GetDynamicMemberNames();

        public virtual DynamicMetaObject GetMetaObject(Expression parameter);

        public virtual bool TryBinaryOperation(BinaryOperationBinder binder, object arg, out object result);

        public virtual bool TryConvert(ConvertBinder binder, out object result);

        public virtual bool TryCreateInstance(CreateInstanceBinder binder, object[] args, out object result);

        public virtual bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes);

        public virtual bool TryDeleteMember(DeleteMemberBinder binder);

        public virtual bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result);

        public virtual bool TryGetMember(GetMemberBinder binder, out object result);

        public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object result);

        public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result);

        public virtual bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value);

        public virtual bool TrySetMember(SetMemberBinder binder, object value);

        public virtual bool TryUnaryOperation(UnaryOperationBinder binder, out object result);
    }

 

posted @ 2014-08-27 13:23  昝昝  阅读(226)  评论(0编辑  收藏  举报