频道栏目
首页 > 资讯 > C# > 正文

常用算法帖(C#): Dynamic Object

13-04-16        来源:[db:作者]  
收藏   我要投稿

 Dynamic Object包含在.Net4.0中,该对象可以允许我们在运行时中改变它的类型,有了这种万金油还有什么问题是我们不能解决的呢?我们来看看它的几个使用例子吧:

Var类型和Dynamic类型
[csharp] 
public static void TestDynamicObject() 
{  
    //var object and dynamic object  
    var varObj = "this is a var object"; 
    dynamic dyObj = "this is a dynamic object"; 
 
    Console.WriteLine(varObj); 
    Console.WriteLine(dyObj); 
 
    dyObj = new string[] { dyObj, "I also can do it liking this!" }; 
    Console.WriteLine(dyObj[0]); 
    Console.WriteLine(dyObj[1]); 
 
    /*OUT PUT
        this is a var object
        this is a dynamic object
        this is a dynamic object
        I also can do it liking this!
     */ 

        public static void TestDynamicObject()
        {
            //var object and dynamic object
            var varObj = "this is a var object";
            dynamic dyObj = "this is a dynamic object";

            Console.WriteLine(varObj);
            Console.WriteLine(dyObj);

            dyObj = new string[] { dyObj, "I also can do it liking this!" };
            Console.WriteLine(dyObj[0]);
            Console.WriteLine(dyObj[1]);

            /*OUT PUT
                this is a var object
                this is a dynamic object
                this is a dynamic object
                I also can do it liking this!
             */
        }
ExpandObject
[csharp]
public static void TestExpandObject() 
        { 
            dynamic data = new ExpandoObject(); 
 
            data.FirstAttribute = "FirstAttribute"; 
            data.SecondAttribute = "SecondAttribute"; 
            data.ThirdAttribute = "ThirdAttribute"; 
 
            ArrayList nums = new ArrayList(); 
            for (int i = 1; i <= 10; i++) 
            { 
                nums.Add(i); 
            } 
 
            data.Nums = nums; 
 
            foreach (int tmp in data.Nums) 
            { 
                Console.WriteLine(tmp); 
            } 
 
            Console.WriteLine(data.FirstAttribute); 
            Console.WriteLine(data.SecondAttribute); 
            Console.WriteLine(data.ThirdAttribute); 
 
            Action GB = () => { Console.WriteLine("This is dynamic method."); }; 
            data.MyMethod2 = GB; 
            data.MyMethod2(); 
 
            Action<string> GhostBear = a => Console.WriteLine(a); 
            data.MyMethod = GhostBear; 
            data.MyMethod("Go!Go!Fighting!"); 
 
            /*OUT PUT
                1
                2
                3
                4
                5
                6
                7
                8
                9
                10
                FirstAttribute
                SecondAttribute
                ThirdAttribute
                This is dynamic method.
                Go!Go!Fighting!
 
             */ 
        } 

public static void TestExpandObject()
        {
            dynamic data = new ExpandoObject();

            data.FirstAttribute = "FirstAttribute";
            data.SecondAttribute = "SecondAttribute";
            data.ThirdAttribute = "ThirdAttribute";

            ArrayList nums = new ArrayList();
            for (int i = 1; i <= 10; i++)
            {
                nums.Add(i);
            }

            data.Nums = nums;

            foreach (int tmp in data.Nums)
            {
                Console.WriteLine(tmp);
            }

            Console.WriteLine(data.FirstAttribute);
            Console.WriteLine(data.SecondAttribute);
            Console.WriteLine(data.ThirdAttribute);

            Action GB = () => { Console.WriteLine("This is dynamic method."); };
            data.MyMethod2 = GB;
            data.MyMethod2();

            Action<string> GhostBear = a => Console.WriteLine(a);
            data.MyMethod = GhostBear;
            data.MyMethod("Go!Go!Fighting!");

            /*OUT PUT
                1
                2
                3
                4
                5
                6
                7
                8
                9
                10
                FirstAttribute
                SecondAttribute
                ThirdAttribute
                This is dynamic method.
                Go!Go!Fighting!

             */
        }
自定义扩展的Dynamic对象(需要继承DynamicObject类)
[csharp]
class MyDynamicObject : DynamicObject 
   { 
       Dictionary<string, object> data = new Dictionary<string, object>(); 
 
       /// <summary>  
       ///   
       /// </summary>  
       /// <param name="binder">传进来的参数,包含了调用信息</param>  
       /// <param name="result">返回包含的对象</param>  
       /// <returns>返回是否成功</returns>  
       public override bool TryGetMember(GetMemberBinder binder, out object result) 
       { 
           bool isContain = false; 
           if (data.ContainsKey(binder.Name)) 
           { 
               result = data[binder.Name]; 
               isContain = true; 
           } 
           else 
           { 
               result = "Not Find"; 
           } 
           return isContain; 
       } 
 
       /// <summary>  
       ///   
       /// </summary>  
       /// <param name="binder">传进来的参数,包含了调用信息</param>  
       /// <param name="value">传进来的参数,包含了调用信息</param>  
       /// <returns></returns>  
       public override bool TrySetMember(SetMemberBinder binder, object value) 
       { 
           bool result = false; 
           if (!data.ContainsKey(binder.Name)) 
           { 
               data[binder.Name] = value; 
               result = true; 
 
           } 
           return result; 
       } 
 
       /// <summary>  
       ///   
       /// </summary>  
       /// <param name="binder">传进来的参数,包含了调用信息</param>  
       /// <param name="args">传进来的参数,包含了调用信息</param>  
       /// <param name="result">方法体执行后返回的结果</param>  
       /// <returns>调用是否成功</returns>  
       public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
       { 
           dynamic tmp = data[binder.Name]; 
           result = null; 
 
           tmp((string)args[0]); 
 
           return true; 
       } 
   } 

 class MyDynamicObject : DynamicObject
    {
        Dictionary<string, object> data = new Dictionary<string, object>();

        /// <summary>
        ///
        /// </summary>
        /// <param name="binder">传进来的参数,包含了调用信息</param>
        /// <param name="result">返回包含的对象</param>
        /// <returns>返回是否成功</returns>
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            bool isContain = false;
            if (data.ContainsKey(binder.Name))
            {
                result = data[binder.Name];
                isContain = true;
            }
            else
            {
                result = "Not Find";
            }
            return isContain;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="binder">传进来的参数,包含了调用信息</param>
        /// <param name="value">传进来的参数,包含了调用信息</param>
        /// <returns></returns>
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            bool result = false;
            if (!data.ContainsKey(binder.Name))
            {
                data[binder.Name] = value;
                result = true;

            }
            return result;
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="binder">传进来的参数,包含了调用信息</param>
        /// <param name="args">传进来的参数,包含了调用信息</param>
        /// <param name="result">方法体执行后返回的结果</param>
        /// <returns>调用是否成功</returns>
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            dynamic tmp = data[binder.Name];
            result = null;

            tmp((string)args[0]);

            return true;
        }
    }
[csharp]
public static void TestExtendDynamicObject() 

    dynamic myDynamicObject = new MyDynamicObject(); 
    myDynamicObject.FirstAttribute = "FirstAttribute"; 
 
    Action<string> myMethod = a => Console.WriteLine(a); 
    myDynamicObject.myMethod = myMethod; 
 
    Console.WriteLine(myDynamicObject.FirstAttribute); 
    myDynamicObject.myMethod("this is Dynamic Object"); 
 
    /*OUT PUT
     FirstAttribute
     this is Dynamic Object
 
     */ 

        public static void TestExtendDynamicObject()
        {
            dynamic myDynamicObject = new MyDynamicObject();
            myDynamicObject.FirstAttribute = "FirstAttribute";

            Action<string> myMethod = a => Console.WriteLine(a);
            myDynamicObject.myMethod = myMethod;

            Console.WriteLine(myDynamicObject.FirstAttribute);
            myDynamicObject.myMethod("this is Dynamic Object");

            /*OUT PUT
             FirstAttribute
             this is Dynamic Object

             */
        }

 

相关TAG标签
上一篇:function to convert ticks to DatetimeOffset
下一篇:第一个只出现一次的字符
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站