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

class Program
{
static void Main(string[] args)
{
object obj = GetObj("张三", );
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("张三", );
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("张三", );
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;
}
}
}

dynamic的使用的更多相关文章

  1. var和dynamic的区别

    1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...

  2. 遍历dynamic的方式

    一.遍历ExpandoObject /// <summary> /// 遍历ExpandoObject /// </summary> [TestMethod] public v ...

  3. C# dynamic 动态创建 json

    1. 如何通过C# 的dynamic 创建如下json 对象? { "query": { "match": [{ "name": " ...

  4. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  5. 当类型为dynamic的视图模型遭遇匿名对象

    当年在ASP.NET MVC 1.0时代我提到,在开发时最好将视图的Model定制为强类型的,这样可以充分利用静态检查功能进行排错.不过有人指出,这么做虽然易于静态检查,但是定义强类型的Model类型 ...

  6. 动态规划 Dynamic Programming

    March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...

  7. 理解C# 4 dynamic(4) – 让人惊艳的Clay

    Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象.Clay和ExpandoObject相比, ...

  8. [原创] C# dynamic拼接Json串

    using Newtonsoft.Json; 之前拼接两个json串,是用的这样的代码 , json1.Length - ); json2 = json2.Insert(json2 - , tmp); ...

  9. dynamic 用法

    private static string GetNameValue(object value) { dynamic obj = value; try { return obj.Name; } cat ...

  10. Euler Tour Tree与dynamic connectivity

    Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online) ...

随机推荐

  1. Nestjs 微服务

    文档 工作示例 安装: $ npm i --save @nestjs/microservices main.ts import { NestFactory } from '@nestjs/core'; ...

  2. element 如何自定义主题

    自定义主题 在我学习element的时候,就直接忽略了.现在返回来学习一下 ,原来 通过自定义主题可以改变elemnt中默认的一些样式.这样,对于一些不想用elment自带但是用到比较多的样式,可以进 ...

  3. Android自定义控件之日历控件

      标签: android 控件 日历 应用 需求 2015年09月26日 22:21:54 25062人阅读 评论(109) 收藏 举报 分类: Android自定义控件系列(7) 版权声明:转载注 ...

  4. 使用 JProbe 调试 Linux 内核(转)

    https://liam.page/2018/04/28/debug-in-Linux-kernel-jprobe/

  5. vue table 固定首列和首行

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  6. CPU漏洞补丁KB4056892 卸载及忽略办法

    2018.1.4微软发布了针对intel CPU漏洞的补丁 KB4056892 性能降低不说, 针对一般平民根本没多大意义, 另外还会导致一些软件无法正常使用, (我是使用蓝叠经典版, 启动就会蓝屏) ...

  7. php中数组直接用加号相加array+array

    php中数组功能非常强大,甚至也可以直接通过+相加来合并数组. A数组 $a = ['a', 'b']; B数组 $b = ['c', 'd', 'e']; A+B结果 Array ( [0] =&g ...

  8. Head First Python-Python简单处理文件

    前面介绍了自定义格式化输出列表函数printList(),下面再介绍下格式化列表项及列表项的排序. 这里有一组列表数据,记录运动员跑步时间的,要求按照时间大小进行排序.这里每项数据记录的时间格式不一样 ...

  9. C博客作业01--分支,顺序结构

    1.本章学习总结 1.1 思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 因为暑假的时候没有事先了解过C语言这门课程,翁恺老师的学习视频没看,pta习题也没有刷,所以开学后学得也蛮吃 ...

  10. python之路—博客目录

    python基础一 格式化输出&初始编码&运算符 数据类型&字符串得索引及切片 列表 & 元组& join & range 字典dict python2 ...