【转】C# 动态对象(dynamic)的用法
说到正确用法,那么首先应该指出一个错误用法:
常有人会拿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)的用法相关推荐
- C#中动态类型dynamic用法浅析
动态类型dynamic是微软在.net framework 4.0开始引入的,其目的是在程序编译过程中忽略对类型的检查,等到运行时刻再明确定义的对象的类型. 使用dynamic类型可以简化代码 ...
- 使用ExpandoObject将XML转换为动态对象
目录 介绍 *更新 *更新2 编码 XML示例 用法 注意 介绍 我开始在Internet上寻找一种简单的方法来加载XML文件并将其即时转换为对象.我的目标是为正在处理的Web项目以XML格式动态加载 ...
- java中dynamic_介绍@dynamic的用法
介绍@dynamic的用法 Objective-C 2.0提供了属性(@property),可以让编译器自动生成setter和getter方法.如果不想编译器自作主张生成这些setter和getter ...
- 9.mybatis动态SQL标签的用法
mybatis动态SQL标签的用法 动态 SQL MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦 ...
- Java 动态代理介绍及用法
Java 动态代理介绍及用法 一,静态代理模式的特点 在之前的文章中 java代理模式 已经介绍里java里的(静态)代理模式 下面是上文静态代理类的例子: public class ProxyBea ...
- c#Clay开源的动态语言dynamic框架,让您形如javascript的方式创建对象!
简介 Clay非常类似于ExpandoObject, 可以看做是ExpandoObject的加强版. 它们能够让我们在不需要定义类的情况下,就构建出我们想要的对象.Clay和ExpandoObject ...
- C# dynamic 类型用法举例
dynamic类型允许编写忽略编译期间的类型检查的代码.编译器假定,给dynamic类型的对象定义的任操作都是有效的.如果该操作无效,则在代码运行之前不会检测该错误,如下面的示例所示: 这个示例没有编 ...
- python datetime.date 和数据库date_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...
"专业人士笔记"系列目录:创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com 将字符串解析为对应时区的datetime对象 ...
- easy excel date 类型解析报错_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...
"专业人士笔记"系列目录: 创帆云:Python成为专业人士笔记--强烈建议收藏!每日持续更新!zhuanlan.zhihu.com 将字符串解析为对应时区的datetime对象 ...
- jvm误区--动态对象年龄判定
学习jvm的人,基本都阅读过上面这段话,这里讲的是动态年龄的判定.对于动态的判定的条件就是相同年龄所有对象大小的总和大于Survivor空间的一半,然后算出的年龄要和MaxTenuringThresh ...
最新文章
- Nat. Commun. | 机器学习在化学发现中的应用
- 活动报名|“悟道之巅:AI创新应用大赛”发布会——体验未来技术,赢取百万奖金...
- VMware安装RedHat 6(64位)报错问题
- 前端学习(2163):安装clint错误和ESlint规范
- linux 启动 x,(1)linux启动过程
- Git如何配置多个SSH-Key呢?
- fail to build phoneME Feature-转
- php 实现贪心算法,python贪心算法如何实现 python贪心算法实现代码示例
- 74HC138 三八译码器
- UTF-8转换成GBK
- 使用redis缓存技术实现省市区三级联动
- pdf转图片在线转换免费
- 情境领导者的三体思维
- Python SMTP 163邮箱发送邮件不成功
- sre_constants.error: unbalanced parenthesis
- 最简洁的呼吸灯实验verilog
- Python检测数据不完整的JPG图片
- 这些手写代码会了吗?少年
- VBA、.net查汉字区位码
- 用NetCDF创建和读取NC文件