动态查找 dynamic

一.Dynamic类型

C#4引入了dynamic关键字,用于定义变量;

dynamic myval;

它与var关键字不同,的确存在dynamic类型,所以无需初始化他的值;

dynamic类型不同寻常之处是,它仅在编译期间存在,在运行期间会被System.Objcet类型代替,这一点必须记住。

 

无论myval实际包含什么值,这行代码都会编译,但是如果所请求的成员不存在,在执行这行代码的时候会生成一个RuntimeBinderException类型的异常。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Microsoft.CSharp.RuntimeBinder;
using System.Dynamic;

namespace DynamicDemo
{
    class MyClass1
    {
        public int add(int var1,int var2)
        {
            return var1 + var2;
        }
    }

    class MyClass2
    {

    }

    class Program
    {
        static int callCount = 0;

        static dynamic GetVlaue()
        {
            if (callCount++ == 0)
            {
                return new MyClass1();
            }

            return new MyClass2();
        }

        static void Main(string[] args)
        {
            try
            {
                dynamic firstresult = GetVlaue();
                dynamic secondresult = GetVlaue();

                Console.WriteLine("firstresult is {0}", firstresult.ToString());
                Console.WriteLine("secondresult is {0}", secondresult.ToString());

                Console.WriteLine("first call is {0}", firstresult.add(2,3));
                Console.WriteLine("second call is {0}", secondresult.add(2, 3));
            }
            catch (RuntimeBinderException ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadLine();
        }
    }
}

dynamic也可以用于其他类型名的地方,例如

public int Add(dynamic var1,dynamic var2)

{

  return var1+var2;

}

Note:

应该注意如何使用动态类型,在运行期间对成员访问应用某种技术时会发生什么。实际上,有3种不同的方式访问成员:

  • 如果动态值是COM(Component Object Model,组件对象模型)对象,就使用COM技术访问成员;
  • 如果动态值支持IDynamicMetaObjectProvider接口,就使用该接口访问类型成员;
  • 如果不成使用上面的技术,就使用反射(Reflection);
原文地址:https://www.cnblogs.com/zzunstu/p/3404053.html