一、在没有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. day 23 二十三、对象方法,类方法,封装,绑定方法

    一.对象的特有名称空间 __init__方法会在实例化对象时被调用 1.会为实例化的对象形成空的名称空间 2.就是一个方法,可以被传参,在类名(实参)这种方式下调用并传参 __init__(self ...

  2. mysql 查询 练习题及答案

    CREATE DATABASE school;USE school;/*1.创建student表格*//*id为主键 非空 唯一 */CREATE TABLE student (id INT(10) ...

  3. spring cloud

    如果是一个大型的网站,内部子系统较多.接口非常多的情况下,RPC框架的好处就显示出来了,首先就是长链接,不必每次通信都要像http 一样去3次握手什么的,减少了网络开销:其次就是RPC框架一般都有注册 ...

  4. mysql中in的用法

    今天在工作中遇到一个查询问题,两张表的联合查询,本来我的想法是先查询一张表,然后遍历查到的所有表,拿到id,去另外一张表查询,这样做也能解决问题,但是这样的话,就用不了框架里的分页了,自己写分页比较麻 ...

  5. django的闪现和增、删、改、查

    使用 messages 闪现在views.py中导入 from django.contrib import messages 在html中 {% if messages %} {% for mess ...

  6. 使用sysbench压测磁盘io

    Ⅰ.sysbench安装 cd /usr/local/src yum -y install make automake libtool pkgconfig libaio-devel git clone ...

  7. TCP三次握手那些事

    临近5月,春招和实习招聘逐渐进入尾声.本文主要讨论面试中经常提问的TCP连接的机制,附带一些扩展知识. 参加面试的时候,过半的面试官都会问TCP相关问题,而最常见的问题就是:讲一下TCP三次握手(四次 ...

  8. oracle 约束与索引

    1.约束 1.not null(列表不为空) create table 表名(列名1 列表属性2 not null,列名1 列表属性2 not null); 2.unique(列表不能重复) crea ...

  9. 使用openSSL开源工具进行SSL/TLS 安全测试

    本文介绍了使用半自动化工具执行SSL&TLS安全性评估的过程,以及如何使用手动及工具的测试方法验证并发现问题.目的是优化TLS和SSL安全测试流程,帮助信息安全顾问在渗透测试时在TLS / S ...

  10. KXO151 Programming & Problem Solving

    Page 1 of 9KXO151 Programming & Problem SolvingAIEN-SOU - 2019Assignment 2Deadline for Submissio ...