用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. JavaScript Dom入门

    好像代码太杂了,博客园里跑不起来,单独复制到html中本地测试都是没有问题的. JavaScript JavaScript 是属于 web 的语言,它适用于 PC.笔记本电脑.平板电脑和移动电话. J ...

  2. Hyperledger Fabric 1.0 从零开始(九)——Fabric多节点集群生产启动

    7:Fabric多节点集群生产启动 7.1.多节点服务器配置 在生产环境上,我们沿用4.1.配置说明中的服务器各节点配置方案. 我们申请了五台生产服务器,其中四台服务器运行peer节点,另外一台服务器 ...

  3. Linux sftp 另外一台机器时,出现:receive message is too long

    因为在linux登录时,首先会运行的三个文件是: /etc/profile,/home/用户名/.bashrc,其次是/home/用户名/.bash_profile,出现这个问题的原因是因为在sftp ...

  4. SAP的这三款CRM解决方案,您能区分清楚么

    我的一位同事, John Burton, 在2017年12月底写过一篇博文:Explaining SAP's portfolio of "CRM Service" related ...

  5. sso示例代码

    个人写的一个关于在ASP.NET 中如何实现SSO单点登录,这可能也是.NET实现大型互联网项目的第一步要解决的问题.已经放到GitHub上供大家参考.https://github.com/bidia ...

  6. iOS 开发 右滑返回上一级控制器

    #import <objc/runtime.h> @interface UINavigationController (Transition)<UIGestureRecognizer ...

  7. mybatis注解开发,动态sql

    在利用mybatis注解开始时,如果没有用到动态sql时,可以直接写 @Select("select * from order") List<XlSubOrder> g ...

  8. 视觉slam十四讲习题ch3-6

    题目回顾: 一般解线性方程Ax=b有哪几种做法?你能在Eigen中实现吗? 解: 线性方程组Ax = b的解法 : 1.直接法:(1,2,3,4,5) 2.迭代法:如Jacobi迭代法(6) 其中只有 ...

  9. XML Schema格式的"日期型数据”数据库存取

    对于XML Schema格式的"日期型数据"在数据库中存于datetime字段的时候,出现错误 mysql> select @@sql_mode; +------------ ...

  10. Hexo next博客添加折叠块功能添加折叠代码块

    前言 有大段的东西想要放上去,但又不想占据大量的位置.折叠是最好的选择.下面在Hexo的主题上定制添加折叠功能. 本文基于Hexo Next的主题修改.其他主题应该也差不多. 在main.js中添加折 ...