zoukankan      html  css  js  c++  java
  • dynamic的使用

    一、在没有dynamic之前,我们想要获取返回object对象里的属性的值时,使用反射的方法来获取该对象的属性值。

    class Program
    {
        static void Main(string[] args)
        {
            object obj = GetObj("张三", 21);
            var objName = obj.GetType().GetProperty("Name").GetValue(obj);
            Console.WriteLine(objName);
        }
        static object GetObj(string name, int age)
        {
            return new { Name = name, Age = age };
        }
    }

    二、使用dynamic后,就可以直接【对象实例.属性名称】获取对象的属性值了。

    class Program
    {
        static void Main(string[] args)
        {
            dynamic obj = GetObj("张三", 21);
            var objName = obj.Name;
            Console.WriteLine(objName);
        }
        static object GetObj(string name, int age)
        {
            return new { Name = name, Age = age };
        }
    }

    三、当返回object对象的方法与调用的位置不在同一项目时(也就是当GetObj()方法在一个类库项目,而我在控制台中调用该方法),如:

      我新建一个【DynamicClassLibrary】的类库项目,新建一个DynamicClass类,给它定义一个GetObj方法,而我在ConsoleApplication1控制台项目的Main方法中调用

      

    namespace DynamicClassLibrary
    {
        public class DynamicClass
        {
            public object GetDyObj(string name, int age)
            {
                // 还需要在当前程序集DynamicClassLibrary的AssemblyInfo.cs中加上[assembly: InternalsVisibleTo("使用该方法的程序集名称")]
                return new {Name = name, Age = age};
            }
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            dynamic obj = new DynamicClassLibrary.DynamicClass().GetDyObj("张三", 21);
            var objName = obj.Name;
            var objAge = obj.Age;
            Console.WriteLine(objName + "" + objAge);
        }
    }

    这时候会报出这样的错误:【“object”未包含“Name”的定义】,原因可以看看:http://www.cnblogs.com/feiyun0112/p/4002291.html

    解决办法有两种:

    1、方法一:在DynamicClassLibrary项目的AssemblyInfo.cs中加上[assembly: InternalsVisibleTo("使用该方法的程序集名称")],这样就可以正常运行了。

     

    2、方法二:使用dynamic自带的ExpandoObject类创建dynamic对象实例,这样就不用去修改DynamicClassLibrary项目的AssemblyInfo了,只需将GetObj方法改一下即可。

    namespace DynamicClassLibrary
    {
        public class DynamicClass
        {
            public object GetDyObj(string name, int age)
            {
                // 还需要在当前程序集DynamicClassLibrary的AssemblyInfo.cs中加上[assembly: InternalsVisibleTo("使用该方法的程序集名称")]
                //return new {Name = name, Age = age};
    
                dynamic dyObj = new System.Dynamic.ExpandoObject();
                dyObj.Name = name;
                dyObj.Age = age;
                return dyObj;
            }
        }
    }
  • 相关阅读:
    理解Docker(6):若干企业生产环境中的容器网络方案
    理解Docker(5):Docker 网络
    理解Docker(4):Docker 容器使用 cgroups 限制资源使用
    理解Docker(3):Docker 使用 Linux namespace 隔离容器的运行环境
    理解Docker(2):Docker 镜像
    理解Docker(1):Docker 安装和基础用法
    OpenStack 行业正进入拓展期:行业云将成为新一轮工业革命的基础设施和引擎
    PHP通用返回值设置
    C++ 模板学习 函数模板、类模板、迭代器模板
    C++/Php/Python 语言执行shell命令
  • 原文地址:https://www.cnblogs.com/lusunqing/p/4081792.html
Copyright © 2011-2022 走看看