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

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

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

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);
}
}

from

http://www.cnblogs.com/manupstairs/p/3166850.html

dynamic 动态获取object数据的更多相关文章

  1. ECharts 环形饼图 动态获取json数据

    ECharts  环形饼图 动态获取json数据 效果图如下: 一.html部分 <div id="secondPieChart" style="width:100 ...

  2. [Python爬虫] 之一 : Selenium+Phantomjs动态获取网站数据信息

    本人刚才开始学习爬虫,从网上查询资料,写了一个利用Selenium+Phantomjs动态获取网站数据信息的例子,当然首先要安装Selenium+Phantomjs,具体的看 http://www.c ...

  3. echarts 柱状图和饼状图动态获取后台数据

    运用echarts来实现图表 1.首先下载echarts包  http://echarts.baidu.com/echarts2/doc/example.html,在这里我下载的是 2.将echart ...

  4. 使用bootstrap-select控件 搜索栏键入关键字动态获取后台数据

    bootstrap-select开源地址:https://github.com/silviomoreto/bootstrap-select bootstrap-select使用示例:http://si ...

  5. thymeleaf下拉框从后台动态获取集合数据并回显选中

    今天遇到从后台集合中取出对象在前台页面下拉列表展示: <select name="signature" lay-search="" class=" ...

  6. 如何获取object数据的描述符

    const data = { portLand: '78/50', Dublin: '88/52', Lima: '58/40' } Object.defineProperty(data, 'Lima ...

  7. ECharts动态获取后台传过来的json数据进行多个折线图的显示,折线的数据由后台传过来

    ECharts 多个折线图动态获取json数据 效果图如下: 一.html部分 <p id="TwoLineChart" style="width:100%; he ...

  8. js动态获取子复选项并设计全选及提交

    在做项目的时候,会遇到根据父选项,动态的获取子选项,并列出多个复选框,提交时,把选中的合并成一个字符提交后台 本章将讲述如何通过js控制实现该操作: 1:设计父类别为radio,为每一个radio都加 ...

  9. js动态添加table 数据tr td

    成果库修改:      要求主题列表随成果类型改变而改变      网上查询资料后开工,在成果类型下拉框添加change()事件触发Dwr,查询主题集合——动态创建/编辑Table      概要代码 ...

随机推荐

  1. Linux下修改网卡IP、DNS和网关

    Linux下修改网卡IP和网关 建议通过终端字符方式下来修改 一.修改IP地址 vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOO ...

  2. as。 对象和数组

    ---恢复内容开始--- http://w3help.org/zh-cn/causes/SJ9011 ---恢复内容结束--- http://zengrong.net/post/5.htm

  3. php开启新的进程或者线程

    开启线程: $php_cli_path = '/usr/bin/php';$dir_path = dirname(__FILE__)."/".'CheckTaskState.she ...

  4. ASP.NET 不同页面之间传值

    不同页面之间如何传值?我们假设A和B两个页面,A是传递,B是接收. 下面学习4种方式: 通过URL链接地址传递 POST方式传递 Session方式传递 Application方式传递 1. 通过UR ...

  5. 网站压力测试工具webbench 安装与使用

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好用,安装使用也特别方便,并且非常小. 主要是 -t 参数用着比较爽,下面参考了张宴的文章 ...

  6. 当 tcpdump -w 遇到 Permission denied

    为了定位问题,需要在Linux上使用tcpdump并且保存到文件,遇到了如下问题: tcpdump port 9001 -w xxtcpdump: xx: Permission denied 因为已经 ...

  7. 在Linux平台上用ASP.NET 5 连接Redis服务器

    最近在做一个Linux平台上基于ASP.Net 5 中间件+Redis+Mysql架构的系统,研究使用了 StackExchange.Redis 作为asp.net5连接redis的工具.作者在前几天 ...

  8. eclipse引用头文件报错问题-解决方法

    最近在做一个U-BOOT相关的项目,经过几天的折腾最终放弃使用VIM和一堆附加插件.最终的出的结论是对于中大型工程项目还是要启用一些专业的IDE比较稳妥,尽管VIM提供的各种插件累加在一起足以实现专业 ...

  9. [转]Oracle ORA-01403: no data found Exception SYS_REFCURSOR

    本文转自:http://stackoverflow.com/questions/9104153/what-is-the-correct-way-to-deal-with-this-oracle-ora ...

  10. plot函数功能总结

    基本形式 >> y=[1 2 3 4 5 6]; >> plot(y) 生成的图形是以序号为横坐标.数组y的数值为纵坐标画出的折线. >> x=linspace(0 ...