说到正确用法,那么首先应该指出一个错误用法:

常有人会拿var这个关键字来和dynamic做比较。实际上,var和dynamic完全是两个概念,根本不应该放在一起做比较。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

我认为dynamic很有价值的一点是:

类型转换

Dynamic类型的实例和其他类型的实例间的转换是很简单的,开发人员能够很方便地在dyanmic和非dynamic行为间切换。任何实例都能隐式转换为dynamic类型实例,见下面的例子:

dynamic d1 = 7;

dynamic d2 = "a string";

dynamic d3 = System.DateTime.Today;

dynamic d4 = System.Diagnostics.Process.GetProcesses();

Conversely, an implicit conversion can be dynamically applied to any expression of type dynamic.

反之亦然,类型为dynamic的任何表达式也能够隐式转换为其他类型。

int i = d1;

string str = d2;

DateTime dt = d3;

System.Diagnostics.Process[] procs = d4;

dynamic可以简化反射。

首先还是声明一下,使用场景:

1、如果编译时函数名称确定,对象类型运行时确定,那么运用dynamic是一个好主意。
2、如果编译时函数名称确定,对象类型在编译时也确定,那就既不需要反射也不需要dynamic。
3、如果函数名称在运行时才能确定的话,那函数名称就是一个字符串,必须使用反射来完成。

以前我们这样使用反射:

public class DynamicSample
{
public string Name { get; set; }public int Add(int a, int b)
{
return a + b;
}
}
DynamicSample dynamicSample = new DynamicSample(); //create instance为了简化演示,我没有使用反射
var addMethod = typeof(DynamicSample).GetMethod("Add");
int re = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });

现在,我们有了简化的写法:

dynamic dynamicSample2 = new DynamicSample();
int re2 = dynamicSample2.Add(1, 2);

【转】C# 动态对象(dynamic)的用法相关推荐

  1. C#中动态类型dynamic用法浅析

      动态类型dynamic是微软在.net framework 4.0开始引入的,其目的是在程序编译过程中忽略对类型的检查,等到运行时刻再明确定义的对象的类型.   使用dynamic类型可以简化代码 ...

  2. 使用ExpandoObject将XML转换为动态对象

    目录 介绍 *更新 *更新2 编码 XML示例 用法 注意 介绍 我开始在Internet上寻找一种简单的方法来加载XML文件并将其即时转换为对象.我的目标是为正在处理的Web项目以XML格式动态加载 ...

  3. java中dynamic_介绍@dynamic的用法

    介绍@dynamic的用法 Objective-C 2.0提供了属性(@property),可以让编译器自动生成setter和getter方法.如果不想编译器自作主张生成这些setter和getter ...

  4. 9.mybatis动态SQL标签的用法

    mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...

  5. Java 动态代理介绍及用法

    Java 动态代理介绍及用法 一,静态代理模式的特点 在之前的文章中 java代理模式 已经介绍里java里的(静态)代理模式 下面是上文静态代理类的例子: public class ProxyBea ...

  6. c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!

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

  7. C# dynamic 类型用法举例

    dynamic类型允许编写忽略编译期间的类型检查的代码.编译器假定,给dynamic类型的对象定义的任操作都是有效的.如果该操作无效,则在代码运行之前不会检测该错误,如下面的示例所示: 这个示例没有编 ...

  8. python datetime.date 和数据库date_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...

    "专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com 将字符串解析为对应时区的datetime对象 ...

  9. easy excel date 类型解析报错_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...

    "专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!​zhuanlan.zhihu.com 将字符串解析为对应时区的datetime对象 ...

  10. jvm误区--动态对象年龄判定

    学习jvm的人,基本都阅读过上面这段话,这里讲的是动态年龄的判定.对于动态的判定的条件就是相同年龄所有对象大小的总和大于Survivor空间的一半,然后算出的年龄要和MaxTenuringThresh ...

最新文章

  1. Nat. Commun. | 机器学习在化学发现中的应用
  2. 活动报名|“悟道之巅:AI创新应用大赛”发布会——体验未来技术,赢取百万奖金...
  3. VMware安装RedHat 6(64位)报错问题
  4. 前端学习(2163):安装clint错误和ESlint规范
  5. linux 启动 x,(1)linux启动过程
  6. Git如何配置多个SSH-Key呢?
  7. fail to build phoneME Feature-转
  8. php 实现贪心算法,python贪心算法如何实现 python贪心算法实现代码示例
  9. 74HC138 三八译码器
  10. UTF-8转换成GBK
  11. 使用redis缓存技术实现省市区三级联动
  12. pdf转图片在线转换免费
  13. 情境领导者的三体思维
  14. Python SMTP 163邮箱发送邮件不成功
  15. sre_constants.error: unbalanced parenthesis
  16. 最简洁的呼吸灯实验verilog
  17. Python检测数据不完整的JPG图片
  18. 这些手写代码会了吗?少年
  19. VBA、.net查汉字区位码
  20. 用NetCDF创建和读取NC文件

热门文章

  1. 求一个有限长度字符串 最长的有序可重复字符串长度
  2. HDU 1176 免费馅饼 (动态规划、另类数塔)
  3. 架构师成长之路:如何保证消息队列的高可用
  4. java将数据生成csv文件
  5. line-height:1.5和line-height:150%的区别
  6. Vijos——T 1629 八
  7. QML官方系列教程——QML Applications
  8. Chrome 调试动态加载的js
  9. swfit-学习笔记(数组的使用)
  10. 2012.2.18-silverlight设计器崩溃