首页 > 匿名对象

Anonymous type 和 ExpandoObject的区别、各自用法

介绍

我们常用的匿名对象分为2种 

1、Anonymous 类型

动态类,可以理解为你创建的一个没有名称的类

2、ExpandoObject

可以理解为了一个字典,支持动态添加属性


1、Anonymous 用法

当我们new 出来的匿名对象就是 Anonymous 类型

var x=new {id=1};

优点:

(1)当前实体类有提示  x.Id 会提示出Id

(2)用起来很方便new就可以用了

缺点:

  (1)  不支持添加属性 ,比如我想在x中加个name就不行

(2) 跨程序集使用好像有限制


2、ExpandoObject

ExpandoObject 本质上是一个字典 他可以强转成 IDictionary<string,object>  

也可以将IDictionary<string,object>  转成 ExpandoObject  用法非常灵活

dynamic dynEO = new ExpandoObject();//初始化一个不包含任何成员的ExpandoObject
dynEO.number = 20;
dynEO.MeThod = new Func<int, string>(i => { return (i + 20).ToString(); });

优点:

(1)可以任意添加属性

(2)支持跨程序集

缺点:

(1)没有提示

(2)声名不方便,没有new的直观


3、通过 Anonymous to ExpandoObject 结合2者优点

我们封装一个方法将Anonymous转成ExpandoObject,这样他就具备了2者共有的优点

(1)声名方便直观

  (2)  支持跨程序集

  (3)支持添加属性

     static void Main(string[] args)
     {
          dynamic expand =  ToExpandoObject(new { id=1});
          expand.Name="abc";//那么就添加了一个新属性
          //也可以把 expand 转成字典 IDictionary<string,object> 进行字典操作
      }

        public static ExpandoObject ToExpandoObject( object obj)
        {

            IDictionary<string,object> expando = new ExpandoObject();

            foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(obj.GetType()))
            {
                expando.Add(property.Name, property.GetValue(obj));
            }

            return (ExpandoObject)expando;
        }