用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#动态设置匿名类型对象的属性的更多相关文章

  1. 读匿名object对象的属性值

    读匿名object对象的属性值 1.定义读object对象值的功能方法 public static class StaticClass { public static string ValueByKe ...

  2. C# 不同类型对象同名属性赋值

    /// <summary> /// 不同类型对象同名属性赋值 /// </summary> /// <typeparam name="S">源类 ...

  3. Java获取未知类型对象的属性

    获取未知类型对象的属性通常有两种方式: 一是通过自定义注解的方式,通过获取被注解的属性从而获取属性的值,这种方式也是Spring参数注入的重要实现手段 二是通过反射获取属性的名称,通过属性名从而获取属 ...

  4. C#的隐式类型、匿名类型、自动属性、初始化器

    1.隐式类型 1)源起 在隐式类型出现之前,我们声明一个变量时,需要为它指定相应的类型,甚至在foreach一个集合的时候,也要为遍历的集合元素,指定变量的类型,隐式类型出现后,程序员就不用再做这个工 ...

  5. Vue系列——动态设置img标签的src属性

    声明 本文转自:vue动态设置img的src路径 正文 相信开发的小伙伴已经遇到这个问题了,动态切换img标签的src时,写的路径就是不生效,原因是vue并没有把你的路径字符串当做路径来处理,而是直接 ...

  6. 后台动态设置前台标签内容和属性(转自http://www.wzsky.net/html/Program/net/26171.html)

    和以前的asp不同,在asp.net中为了彻底的代码分离,我们一般不采用<%=%>嵌入标签中来设置一些属性和内容.一般来说有2种情况:(一)设置标签的内容,比如<title>这 ...

  7. Android 动态设置TextView的drawableLeft等属性

    首先,我们在开发过程中,会经常使用到android:drawableLeft="@drawable/ic_launcher"这些类似的属性: 关于这些属性的意思,无非是在你的tex ...

  8. 关于如何利用原生js动态给一个空对象添加属性以及属性值

    首先,回忆一下,访问对象属性一共有两种方法:点获取法和方括号获取法.而我们最常用的就是点获取法了.但是当我们遇到需要给对象动态添加属性和属性值时,点获取法好像就不太好用了,尤其是我们不知道属性名的时候 ...

  9. js+jquery动态设置/添加/删除/获取元素属性的两种方法集锦对照(动态onclick属性设置+动态title设置)

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html140 ...

随机推荐

  1. Sqlserver如何递归查询层级数据将父级字段和本级某个字段合并?如何自定义用户函数并调用?

    开门见山,首先说下遇到的问题:前期系统地区字典表中,每个省市县只存了本级名称,没存完整的字段.如:肥西县隶属安徽省合肥市,表中就存了一个肥西县.现有需求需要将完整字段显示,由于系统已在线上运营,无法做 ...

  2. 文件及Linux目录结构

    什么是文件 在linux系统上,所有的资源都是文件,Linux系统下的文件类型包括 普通文件(-) 目录(d) 符号链接(l) 字符设备文件(c) 块设备文件(b) 套接字(s) 命令管道(p) 普通 ...

  3. iOS 横竖屏适配 笔记

    研究消息转发机制 已经一周多了,但是 还是没整理出博客, 还是先写一个 项目中遇到的 横竖屏适配问题. // 开启自动转屏 - (BOOL)shouldAutorotate { return YES; ...

  4. 分布式架构ActiveMQ的安装与使用(单节点)

    具体内容请参考样例代码和视频教程: http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53   IP:192.168.4. ...

  5. 知乎上看到的关于类.class,对象.getClass

    public class TestDemo { //测试 @Test public void fun01() { TestDemo q=new TestDemo(); A a = new A(); q ...

  6. 破解附近寝室的Wifi密码

    [系统]运行在VMware虚拟机中的Kali Linux系统.(实测Kali运行在virtualbox中兼容性很差,VMware支持的很好.我认为这正是一个不要迷信开源的例子,多数情况下,大公司的商业 ...

  7. Java异常(输出[D@139a55问题)

    简单给出一段代码说明问题: public class Main { public static void main(String[] args) { double a[]={1,4,3,2}; Sys ...

  8. NOIP2017游记

    日常大考之前感冒(这次感冒了3周..) Day -4~Day 0 停课一周,不写作业不上课是很爽,然而想到NOIP结束第二天就要期中考.. 在学校刷刷题,跟着一大堆大佬的步伐,做着一大堆大佬的题目(其 ...

  9. deeplearning.ai 改善深层神经网络 week2 优化算法 听课笔记

    这一周的主题是优化算法. 1.  Mini-batch: 上一门课讨论的向量化的目的是去掉for循环加速优化计算,X = [x(1) x(2) x(3) ... x(m)],X的每一个列向量x(i)是 ...

  10. JavaScript call()和apply()

    ECMAScript规范给所有函数都定义了call()与apply()两个方法,call()与apply()的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递 ...