• 动态查找 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);
  • 相关阅读:
    让windows10的右键菜单既显示传统cmd又显示powershell
    配置php环境的一个nginx.conf
    windows中启动和终止nginx的两个批处理
    WxWidgets笔记
    安装archlinux的linux命令记录
    window中的attrib命令
    docker中i的作用
    airflow中的两个参数
    sqlite数据库中为字段设置默认值为当前时间
    记oracle使用expdp将数据导出到asm报错
  • 原文地址:https://www.cnblogs.com/zzunstu/p/3404053.html
Copyright © 2020-2023  润新知