关于匿名对象

匿名对象是.Net Framework 3.0提供的新类型,例如:

var obj = { Name = "aa", Value = 1 };

就是一个匿名类,搭配Linq,可以很灵活的在代码中组合数据,例如:

var r = from p in DbContext.Actions 
    select new { 
      A = p.Name, 
      B = p.Text 
    };

特殊需求:给匿名对象属性赋值

但有时候会有一些特殊的要求,需要给获取的匿名对象的某些属性进行赋值,例如如下的代码:

//根据上例使用LINQ获取的结果集foreach(var item in r) {     item.A = "new name"; }

以上这段代码在运行时,会抛出异常“该对象的属性是只读的”。说明匿名类在内部实现上,只能在初始化的时候赋值,如果想再次改变,对不起,这样是不可以的。

解决方案

但有的时候确实是有这样的需求,那有什么方法可以解决呢? 经过研究,发现可以采用如下的方案解决,本人已经验证通过。

答案就是使用C# 4.0里面新提供的动态类型:dynamic
  直接上代码,想必大家一看就明白了:

//声明dynamic泛型集合List<dynamic> newpayList = new List<dynamic>();            payList.ForEach(t => {//new 一个ExpandoObject对象                dynamic d = new System.Dynamic.ExpandoObject();                d.IntervalDay = 0;                d.Percent = Math.Round(t.Amount / totalRevenue, 4);                d.Amount = adjAmount * Math.Round(t.Amount / totalRevenue, 4);                d.PayDate = t.EstPaymentDate;                d.IsLast = false;                newpayList.Add(d);            });

var count = newpayList.Count();for (int i = 0; i < count; i++)            {var item = newpayList[i];if (i != 0) {//改变动态类型的属性值                    item.IntervalDay = (item.PayDate - newpayList[i - 1].PayDate).Days;                }if( i == count - 1)                    item.IsLast = true;            }

用动态类型取代匿名对象,但实际上,它们之间又有着紧密的联系,在某些时候,匿名对象和dynamic是等价的,这为我们开发带来了很大的灵活性,但这样做的性能开销目前还没有深入研究,如果有哪位朋友测试过,也请告知,谢谢。

转载于:https://www.cnblogs.com/qiuliang/archive/2012/02/17/2356272.html

利用dynamic解决匿名对象不能赋值的问题相关推荐

  1. dynamic和匿名对象

    有时需要使用匿名对象存储数据,而有时需要使用dynamic去提取数据,这里写了一个简单的示例,代码如下 static void Main(string[] args){List<dynamic& ...

  2. java中常用API、Scanner类、匿名对象、Random类、ArrayList类、对象数组

    java中常用API: API:Application Programming Interface,应用程序编程接口.Java API是JDK中提供给我们使用的类的说明文档.这些类将底层的代码实现封装 ...

  3. JAVA常用API : 匿名对象

    匿名对象 //创建一个person对象public static class Person {String name;}public static void main(String[] args) { ...

  4. Tuple解决在视图中通过razor获取控制器传递给视图的匿名对象的报错问题

    C#的编译器总是将匿名类型编译成internal的,当在视图中直接使用控制器传递的匿名对象时就会报错 错误代码: 控制器代码 视图代码 执行结果: ************************** ...

  5. dynamic结合匿名类型 匿名对象传参

    首先说明下,我一般很少用dynamic关键字(类)的,因为毕竟是由反射实现的,所以对于性能方面还是吃亏不少(注:由于心里没底,查了一些资料得知,dynamic实质上好像不是由反射实现的,其性能也比直接 ...

  6. 利用viewbag把数据对象传到前端并转换成json对象,及解决json字符串被转义问题

    利用viewbag把数据对象传到前端并转换成json对象,及解决json字符串被转义问题 参考文章: (1)利用viewbag把数据对象传到前端并转换成json对象,及解决json字符串被转义问题 ( ...

  7. c/c++教程 - 2.4.2.1~2 对象的初始化和清理,构造函数和析构函数,构造函数的分类和调用(有参构造,无参构造,普通构造,拷贝构造,括号法,显示法,隐式转换法,匿名对象)

    目录 4.2 对象的初始化和清理 4.2.1 构造函数和析构函数 4.2.2 构造函数的分类及调用 相关教程 4.2 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置,在某一天我们不用时候 ...

  8. Java基础super关键字、final关键字、static关键字、匿名对象整理

    super关键字 10.1子父类中构造方法的调用 public class Test { public static void main(String[] args) { new Zi(); } } ...

  9. 面向对象4(匿名对象、内部类、包、修饰符、代码块)

    1.匿名对象 指在创建对象的时候,只有创建语句,没将对象地址赋值给某个变量 new Person(); 1.1 特点 1.创建时,可直接使用,没有变量名 new Person().eat(); 2.匿 ...

最新文章

  1. 谁是 2021「IT 圈」年度 C 位?快来报名,彰显你的影响力!
  2. Android Logcat的使用
  3. 关于AutoML的一些笔记
  4. java性能分析工具_java性能分析工具
  5. vs不识别0b二进制格式_数据背后的二进制
  6. 技术应用丨DWS 空间释放(vacuum full) 最佳实践
  7. 计算机应用专业可以考教师资格证不,电大的大专学历可以考教师资格证吗?
  8. mysql返回的数据是什么格式_磁盘格式化后能恢复数据吗?先了解什么是格式化...
  9. 上海交通大学计算机应用作业,上海交通大学继续教育学院计算机应用基础(二)第六次作业计算机安全多媒体_1...
  10. TensorRt - caffe中支持prelu
  11. 2018考研信工所二室
  12. 华为S5700交换机登录认证配置学习笔记
  13. linux tao环境 安装_菜鸟Linux 编译TAO2.0a的问题,求高手指导
  14. 如何在WPS中给一组字母上方添加一个横线
  15. 摄像头、视频采集和摄像设备图像质量判断的几种简单有效目测方法
  16. 龚文祥自爆今日头条微博自媒体年收入仅1000元!
  17. EA001-186-2220-蓝豪杰
  18. poi设置word表格单元格宽度_java poi如何设置word的页面的大小和水平方向?
  19. 启信宝受益所有人界面_希望您的项目成功吗? 然后确保其他人也可以从您的想法中受益。...
  20. 全球未来网络与SDN技术大会5月18日拉开帷幕

热门文章

  1. 图像处理之应用篇-大米计数续
  2. 15个Android通用流行框架大全
  3. 《Ruby程序员修炼之道》(第2版)—第1章1.2节剖析Ruby的安装
  4. Chapter 3 Phenomenon——24
  5. 2011年7月28日星期四精彩网语
  6. 定义简单的反射工厂示例
  7. 企业应用开发平台-GAP平台
  8. BSPreloadTableVew带有预加载功能的tableView
  9. Two ways to assign values to member variables
  10. Android自带的图标集合