dynamic的使用
一、在没有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的使用的更多相关文章
- var和dynamic的区别
1.var 1.均是声明动态类型的变量. 2.在编译阶段已经确定类型,在初始化的时候必须提供初始化的值. 3.无法作为方法参数类型,也无法作为返回值类型. 2.dynamic 1.均是声明动态类型的变 ...
- 遍历dynamic的方式
一.遍历ExpandoObject /// <summary> /// 遍历ExpandoObject /// </summary> [TestMethod] public v ...
- C# dynamic 动态创建 json
1. 如何通过C# 的dynamic 创建如下json 对象? { "query": { "match": [{ "name": " ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- 当类型为dynamic的视图模型遭遇匿名对象
当年在ASP.NET MVC 1.0时代我提到,在开发时最好将视图的Model定制为强类型的,这样可以充分利用静态检查功能进行排错.不过有人指出,这么做虽然易于静态检查,但是定义强类型的Model类型 ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 理解C# 4 dynamic(4) – 让人惊艳的Clay
Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象.Clay和ExpandoObject相比, ...
- [原创] C# dynamic拼接Json串
using Newtonsoft.Json; 之前拼接两个json串,是用的这样的代码 , json1.Length - ); json2 = json2.Insert(json2 - , tmp); ...
- dynamic 用法
private static string GetNameValue(object value) { dynamic obj = value; try { return obj.Name; } cat ...
- Euler Tour Tree与dynamic connectivity
Euler Tour Tree最大的优点就是可以方便的维护子树信息,这点LCT是做不到的.为什么要维护子树信息呢..?我们可以用来做fully dynamic connectivity(online) ...
随机推荐
- vue调用Moment显示时间
1.下载 Moment 网站: http://momentjs.cn/ 2创建一个vue的文本格式 admin.vue 3.定义给值 代码如下 <template> <div ...
- Vue重修02
1.v-for的优先级比v-if/v-show都大 v-bind也可以绑定自定义的属性 2.父组件向子组件传值 <!DOCTYPE html> <html lang="en ...
- 2018-2019-1 20189210 《LInux内核原理与分析》第五周作业
一.系统调用实验 1.库函数将系统调用封装起来,大多数程序员使用库函数进行系统调用. 2.Linux操作系统的体系架构分为用户态和内核态.CPU的执行级别对应的就是内核态,所有指令都可以执行.用户态对 ...
- [LeetCode] Number of Lines To Write String 写字符串需要的行数
We are to write the letters of a given string S, from left to right into lines. Each line has maximu ...
- applicationContext.xml和applicationContext-mvc.xml
1.applicationContext.xml<?xml version="1.0" encoding="UTF-8"?> <beans x ...
- JavaScript基础知识(Math的方法)
Math的方法 Math : 对象数据类型 : Math: {} 是window下的一个键值对: 属性名叫Math,属性值是一个对象 var obj = {a:1}; console.log(obj. ...
- 2019.4.10 初识puppeteer
注:原地址:https://www.cnblogs.com/paris-test/p/9705075.html 一.Puppeteer 介绍 Puppeteer 翻译是操纵木偶的人,利用这个工具,我们 ...
- SQL 约束 索引
--约束constraint--not null 非空约束create table demo01(empno number(4),ename varchar2(10) not null,job var ...
- Python reverse()方法--list
描述 reverse()方法:用于反转列表元素的排列顺序. 语法 语法格式:list.reverse() 参数 NA 返回值 无返回值 实例 #!/usr/bin/python3 a = ['abc' ...
- ajax 未加载出数据时,显示loding,数据显示后,隐藏loading
$("#CreateReport").click(function () { // RptID,Template,TemplateType,FileName var RptID = ...