dynamic关键字才出来的时候,觉得真是没什么用,谁总是和com交互来交互去啊,唯恐避之不及啊。

后来逐渐算是有了一些使用心得,发现这货还真是犀利啊,故在此举几个例子,起抛砖引玉之用。

1.替代XXX.GetType().GetProperty("YYY").GetValue(XXX)

        static object GetPerson()
{
return new Person { Name = "Leo" };
}

有时候难免会遇到这种返回object的倒霉代码(特别是跟反射有关的时候),这时我们又要访问其中的某个属性,那个费劲啊,现在有了dynamic感觉好多了。

            object objPerson = GetPerson();
var objName = objPerson.GetType().GetProperty("Name").GetValue(objPerson);
Console.WriteLine(objName); dynamic dynPerson = GetPerson();
var dynName = dynPerson.Name;
Console.WriteLine(dynName);

另一个好处是性能会得到一程度的提升:

            Watch = new Stopwatch();
Watch.Start();
for (int i = ; i < ; i++)
{
objName = objPerson.GetType().GetProperty("Name").GetValue(objPerson);
}
Watch.Stop();
Console.WriteLine(Watch.Elapsed); Watch.Restart();
for (int i = ; i < ; i++)
{
dynName = dynPerson.Name;
}
Watch.Stop();
Console.WriteLine(Watch.Elapsed);

大致结果如下图,还是快了很多的:

    

2.拯救接手接口没设计好的代码的倒霉孩子

比如这里有N个WCF服务,返回了N个对象的集合,这几个对象没啥关系,其实又有一点关系,倒霉孩子又不会让Entity Framework生成的类自动继承某个接口(本文里用本地方法代替WCF服务)。

这里来举一个例子,首先有下面2个倒霉的类,同样string类型的name是可以提取接口的(这里真的合适提取么……),同样名称但不同类型的ID,完全无关的Age和Price。

    public class Person
{
public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } public static List<Person> GetPersonList()
{
return new List<Person>
{
new Person{ Name = "Leo1" , Age = },
new Person{ Name = "Leo2" , Age = },
new Person{ Name = "Leo3" , Age= }
};
}
} public class Car
{
public Guid ID { get; set; } public string Name { get; set; } public double Price { get; set; } public static List<Car> GetCarList()
{
return new List<Car>
{
new Car{ Name = "Focus1" , Price = },
new Car{ Name = "Focus2" , Price = },
new Car{ Name = "Focus3" , Price = }
};
}
}

我用2个static方法返回不同类型的List<T>来模拟WCF中最普通的调用。

        static void Main(string[] args)
{
List<dynamic> list = new List<dynamic>();
//用本地方法替代WCF服务,您假装是通过WCF获取的list
Person.GetPersonList().ForEach((p) => list.Add(p));
TestDynamic2(list,"Leo2"); list = new List<dynamic>();
//用本地方法替代WCF服务,您假装是通过WCF获取的list
Car.GetCarList().ForEach((c) => list.Add(c));
TestDynamic2(list,"Focus3"); Console.ReadKey();
} private static void TestDynamic2(List<dynamic> list,string name)
{
//可以无差别的使用ID和Name属性
dynamic first = list.OrderBy(d => d.ID).FirstOrDefault(d => d.Name.Contains(name)); //差别对待不同的属性,这里供参考,不建议这么写,这会导致依赖具体的类型
if (first is Person)
{
Console.WriteLine(first.Age);
}
else
{
Console.WriteLine(first.Price);
}
}

本文提供了使用dynamic的一点心得,如果有不对的对方,还望各位不吝指出,非常感谢!

dynamic的一些使用心得的更多相关文章

  1. Dynamic - ExpandoObject学习心得

    1.  今天下午在做开发过程中,遇到了一个问题,要往Xml文件中添加新的节点,做个xml开发的都知道该怎么做,这不是什么难事,我卡卡卡卡把这个问题解决了,但是新问题又来了,要对xml中对应的节点数据添 ...

  2. mysql+tomcat+spring 配置心得(从0开始搭环境)

    前几天公司竞一个标要做个POC,前端AugularJs做mobile界面,后端Spring MVC做Restful API供前端调用. 时间紧急,大家都忙,so我这个不写代码的闲人花一上午配了一套Sp ...

  3. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  4. Axure使用心得分享

    因为之前很少涉及到原型设计,所以对这个原型设计工具也不太熟悉,第一次使用走了不少的弯路,在这里把自己在使用过程中的心得跟大家分享一下,希望能够对大家有所帮助. 一. 元素的选择 我觉得这是Axure原 ...

  5. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  6. PyInstaller打包python脚本的一些心得

    PyInstaller打包python脚本的一些心得 因为在公司经常要帮同事做一个从excel表格中提取出需要的内容的重复工作,比较繁琐还容易出错:于是就想着要写个程序,但是同事又不可能在电脑上也装上 ...

  7. ios面试心得

    第一部分:面试题   注意,下面这些题只是我准备的题库.在实际面试的时候我会根据面试者的水平抽出相应的题目来出的. 技术 基础   为什么说Objective-C是一门动态的语言? 讲一下MVC和MV ...

  8. folly学习心得(转)

    原文地址:  https://www.cnblogs.com/Leo_wl/archive/2012/06/27/2566346.html   阅读目录 学习代码库的一般步骤 folly库的学习心得 ...

  9. Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)

    Cookies   1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...

随机推荐

  1. springcloud(九) springboot Actuator + admin 监控

    前一章讲的都是Feign项目(调用方)的监控.接下来讲的是服务提供方的监控 一.springboot actuator + springboot admin Spring Boot Admin 是一个 ...

  2. ImportError: Couldn't import Django.或者提示Django 模块不存在

    ImportError: Couldn't import Django. 或者 多版本的python引起的,执行以下命令  即可解决问题 python3是新的版本的python python3 -m ...

  3. MYSQL, REDIS 等数据库的介绍

    MySQL: 数据库概述 MySql安装和基本管理 MySQl创建用户和授权 初始mysql语句 库的操作 表的操作 数据类型 数据类型(2) 完整性约束 外键的变种 三种关系 数据的增删改 单表查询 ...

  4. DevExpress GridView 整理

    1:去除 GridView 头上的 "Drag a column header here to group by that column" -->  点击 Run Desig ...

  5. $(function(){})理解

    $(function(){})  =  jQuery(function(){}) = jQuery(document).ready(function(){ });

  6. 迷你MVVM框架 avalonjs 沉思录 第3节 动态模板

    模板的发明是编程史上的一大里程碑,让我们摆脱了烦锁且易出错的字符串拼接,维护性大大提高. 都在JSP,ASP时代,人们已经学会使用include等语句,将多个页面片断拼接成一个页面. 此外,为了将数据 ...

  7. SpringMVC 中xml 配置多数据源

    1,配置jdbc.properties jdbc.driver_one=... jdbc.url_one=..... jdbc.username_one=... jdbc.password_one=. ...

  8. 用Diff和Patch工具维护源码

    在Unix系统下,维护源码版本可以使用很多方法,其中最常用的当然是大名鼎鼎的CVS,但实际上,简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具,Unix标配中的diff和patch工具 ...

  9. php闭包bindTo方法用法

    从手册知道,Closure::bindTo — 复制当前闭包对象,绑定指定的$this对象和类作用域. 创建并返回一个 匿名函数, 它与当前对象的函数体相同.绑定了同样变量,但可以绑定不同的对象,也可 ...

  10. [SoapUI]怎样配置SoapUI运行的不同环境,并在Jenkins上面通过命令调用不用的环境

    配置SoapUI运行的不同环境 Groovy 脚本来控制environment 在Jenkins上面通过命令调用不用的环境 http://www.soapui.org/Test-Automation/ ...