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. Rhythmk 学习 Hibernate 05 - Hibernate 表间关系 [ManyToOne,OneToMany]

    1.项目结构: 1.1.场景说明: 一个订单,包含多个产品 1.2.类文件: Order.java package com.rhythmk.model; import java.util.Date; ...

  2. Git----分支管理01

    分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN. 如果两个平行宇宙互不干扰,那对现在的你也没有啥影响,不过,在某个时间点,两个平行宇宙合 ...

  3. Git----时光穿梭机01

    看这篇文章之前可以先阅读  https://www.cnblogs.com/cxq0017/p/9645944.html 创建版本库这篇文章 我们已经成功地添加并提交了一个readme.txt文件,现 ...

  4. Python运维开发基础05-语法基础

    上节作业回顾(讲解+温习90分钟) #!/usr/bin/env python # -*- coding:utf-8 -*- # author:Mr.chen import os,time Tag = ...

  5. Attribute与元数据

    在MSDN中,Attribute被定义为“是被指定给某一声明的一则附加的声明性信息”. 我们可以通过Attribute来定义设计层面的信息以及运行时(run-time)信息,也可以利用Attribut ...

  6. SQLServer性能优化之---水平分库扩展

      汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 第一次引入文件组的概念:http://www.cnblogs.com/dunitia ...

  7. Java 设计模式系列(三)抽象工厂

    Java 设计模式系列(三)抽象工厂 每天用心记录一点点.内容也许不重要,但习惯很重要!

  8. 界面设计中如何增强CTA按钮召唤力?

    以下内容由Mockplus(摹客)团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具. 网页和软件应用之类数字产品的有效交互系统一般是由拥有各种任务和功能的小元素构成.而为创建更加 ...

  9. 拒绝枯燥,有意思的 Loading 页面动效设计

    互联网时代,网络“提速”日益频繁,人们打开Web或软件的速度越来越快,一般页面缓冲和加载地过程也是几不可查.然而,在某些情况下,例如软件急需加载大量页面,首页急需加载大量内容,用户下载文件过大,甚至是 ...

  10. http://www.atool.org/keytype.php#0-tsina-1-53371-397232819ff9a47a7b7e80a40613cfe1

    http://www.atool.org/keytype.php#0-tsina-1-53371-397232819ff9a47a7b7e80a40613cfe1