C#动态设置匿名类型对象的属性
用C#写WPF程序, 实现功能的过程中碰到一个需求: 动态设置对象的属性,属性名称是未知的,在运行时才能确定。
本来这种需求可以用 Dictionary<string, object> 实现, 但是由于对某个库的依赖,必须使用匿名类型对象
var obj = new{
Title = "标题",
Content = "内容",
Date = DateTime.Now,
Num =
};
而这种对象的属性名称必须硬编码写死,无法在运行时设置,因此这种方法无法满足我的需求。
通过在网上查阅相关资料,发现一种 System.Dynamic.ExpandoObject 类型的对象,在在非常规的使用模式下可以实现我的需求。
dynamic obj = new System.Dynamic.ExpandoObject();
obj.Title = "标题";
obj.Content = "内容";
obj.Date = DateTime.Now;
obj.Num = ;
这是 ExpandoObject 的最普通的使用方法, 还不足以满足需求。而且,ExpandoObject 也不能使用索引器的方式访问对象属性。 然而,ExpandoObject 实现了 IDictionary<string, object> 接口,也就是说只要 ExpandoObject 类型的对象向上转型为 IDictionary<string, object> 类型对象,就可以使用索引器的方式访问对象的属性了。
dynamic obj = new System.Dynamic.ExpandoObject();
var dic = obj as IDictionary<string, object>;
dic[ "Title" ] = "标题";
dic[ "Content" ] = "内容";
dic[ "Date " ] = DateTime.Now;
dic[ ;
因为obj变量和dic变量引用的是同一个对象, 所以通过两个变量中任意一个变量修改对象的值, 都能反映到彼此身上。而dic对象拥有通过索引器修改属性的能力,这也就意味着obj变量间接的具备了这种能力。于是我碰到的问题就得到了解决:将 DataTable类型对象转换成匿名类型对象列表
public static List<Object> Convert(DataTable data) {
var objectList = new List<Object>();
foreach( DataRow row in data.Rows ) {
dynamic dataItem = new System.Dynamic.ExpandoObject();
var dataItemDic = dataItem as IDictionary<string, object>;
foreach( DataColumn col in data.Columns ) {
var name = col.ColumnName;
var val = row[name].ToString();
dataItemDic[ name ] = val;
}
objectList.Add( dataItem );
}
return objectList;
}
原文来自:https://www.chhblog.com/article_view?id=393
C#动态设置匿名类型对象的属性的更多相关文章
- 读匿名object对象的属性值
读匿名object对象的属性值 1.定义读object对象值的功能方法 public static class StaticClass { public static string ValueByKe ...
- C# 不同类型对象同名属性赋值
/// <summary> /// 不同类型对象同名属性赋值 /// </summary> /// <typeparam name="S">源类 ...
- Java获取未知类型对象的属性
获取未知类型对象的属性通常有两种方式: 一是通过自定义注解的方式,通过获取被注解的属性从而获取属性的值,这种方式也是Spring参数注入的重要实现手段 二是通过反射获取属性的名称,通过属性名从而获取属 ...
- C#的隐式类型、匿名类型、自动属性、初始化器
1.隐式类型 1)源起 在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工 ...
- Vue系列——动态设置img标签的src属性
声明 本文转自:vue动态设置img的src路径 正文 相信开发的小伙伴已经遇到这个问题了,动态切换img标签的src时,写的路径就是不生效,原因是vue并没有把你的路径字符串当做路径来处理,而是直接 ...
- 后台动态设置前台标签内容和属性(转自http://www.wzsky.net/html/Program/net/26171.html)
和以前的asp不同,在asp.net中为了彻底的代码分离,我们一般不采用<%=%>嵌入标签中来设置一些属性和内容.一般来说有2种情况:(一)设置标签的内容,比如<title>这 ...
- Android 动态设置TextView的drawableLeft等属性
首先,我们在开发过程中,会经常使用到android:drawableLeft="@drawable/ic_launcher"这些类似的属性: 关于这些属性的意思,无非是在你的tex ...
- 关于如何利用原生js动态给一个空对象添加属性以及属性值
首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...
- js+jquery动态设置/添加/删除/获取元素属性的两种方法集锦对照(动态onclick属性设置+动态title设置)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140 ...
随机推荐
- yield next和yield* next的区别
yield next和yield* next之间到底有什么区别?为什么需要yield* next?经常会有人提出这个问题.虽然我们在代码中会尽量避免使用yield* next以减少新用户的疑惑,但还是 ...
- QtCreator 断点不起作用
使用QtCreator 调试程序时一直无法进入断点,断点根本不起作用. 解决方法: 打开.pro文件 将图中的release改为debug,再次调试运行就可以进入断点了.
- Web程序员必备的CSS工具
对于web开发来说,CSS是最有效的美化页面.设置页面布局的技术.但问题是,CSS是一种标记性语言,语法结构非常的松散.不严谨.WEB程序员会经常发现自己的或别人的CSS文件里有大量的冗余代码或错误或 ...
- Server Tomcat v7.0 Server at localhost failed to start.
1:这里记录一下这个错误,反正百度一大推,但是很长很长,我感觉这个问题肯定是servlet引起的,因为我遇到的总是如此: 2:我的问题如下所示: <servlet> <servlet ...
- windows错误处理
在调用windows API时函数会首先对我们传入的参数进行校验,然后执行,如果出现什么情况导致函数执行出错,有的函数可以通过返回值来判断函数是否出错,比如对于返回句柄的函数如果返回NULL 或者IN ...
- 学习总结:gcc/g++ 编译与链接
gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...
- 批量将webp格式的图片转成png的图片 https://cn.office-converter.com/WEBP-to-PNG
https://cn.office-converter.com/WEBP-to-PNG
- 明星单品tab
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- uboot各种目录下的文件作用
uboot下载地址:http://ftp.denx.de/pub/u-boot/ 1.目录分布 2.目录结构变化: u-boot-2010.03及以前版本├── api ...
- UVA 11292 Dragon of Loowater(简单贪心)
Problem C: The Dragon of Loowater Once upon a time, in the Kingdom of Loowater, a minor nuisance tur ...