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. 个人tools封装

    /** * jQuery 扩展 */(function ($) { $.fn.extend({ /** * 目标为任意对象元素 * 同时绑定单击和双击事件 */ bindClick: function ...

  2. Sonar及其eclipse插件的安装 详细 http://www.importnew.com/10017.html

    参考:http://www.importnew.com/10017.html

  3. 03-使用html静态页面展示执行效果

    使用工作流框架可以做什么事情?写代码呗,没那么简单.

  4. (转)Java 中关于String的空对象(null) ,空值(empty),空格

    原文出处:Java 中关于String的空对象(null) ,空值(empty),空格 定义 空对象: String s = null; 空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例 ...

  5. php识别二维码

    php-zbarcode 是 PHP 读取条形码的扩展模块,目前仅支持 php5.x

  6. Zend_Controller_Front 研究

    如果你裸写php,一个项目就会出现很多的页面控制器(Page Controller),如果项目很大,重复代码就很多,越来越变得很难维护.有了问题,自然就有解决方案!于是前端设计模式  闪亮登场! 前端 ...

  7. 机器学习—集成学习(GBDT)

    一.原理部分: 图片形式~ 二.sklearn实现: 可以看看这个:https://blog.csdn.net/han_xiaoyang/article/details/52663170 1.分类: ...

  8. polymer-developer guide-registration and lifecycle

    注册和声明周期 my = Polymer({ is: "proto-element", created: function() { this.innerHTML = 'create ...

  9. 【StatLearn】统计学习中knn算法的实验(1)

    Problem: Develop a k-NN classifier with Euclidean distance and simple voting Perform 5-fold cross va ...

  10. SpringMvc与Struts2的对比

    目前企业中使用SpringMvc的比例已经远远超过Struts2,那么两者到底有什么区别,是很多初学者比较关注的问题,下面我们就来对SpringMvc和Struts2进行各方面的比较: 1.核心控制器 ...