zoukankan      html  css  js  c++  java
  • 动态查找 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);
  • 相关阅读:
    Flask--目录
    Linux相关目录
    Mac 提示错误”xcrun: error“
    subprocess模块
    压缩模块
    GitPython模块
    Ansible-ansible命令
    YAML语法
    Ansible-安装
    Ansible-概念
  • 原文地址:https://www.cnblogs.com/zzunstu/p/3404053.html
Copyright © 2011-2022 走看看