匿名对象

C#的匿名对象的定义如下:

1
object obj=new {Field1=1,Field2=2};

动态对象ExpandoObject的使用方法如下:

1
2
3
dynamic obj= new ExpandoObject();
obj.Field1=1;
obj.Field2=2;

匿名对象在声明的时候就必须所需要的属性都进行定义,定义后就不能再增加了,也就是下面这种用法是不行的:

1
2
object obj=new {Field1=1,Field2=2};
obj.Field3=3;

编译会出错。这是因为匿名对象的实质仍然是对象,与一般的类没有区别。

ExpandoObject则不同,实质上ExpandoObject可以转换为IDictionary<string,object>,是字典,可进行属性添加。

以上区别在MVC Controller中返回Json对象时可以看出。下面的代码:

1
2
3
4
5
 public JsonResult GetData()
{
object obj=new {Field1=1,Field2=2};
return Json(obj);
}

如果访问这个Action,返回的json对象是{”Field1”:”1”,”Field2”:”2”}

如果用ExpandObject:

1
2
3
4
5
6
public JsonResult GetData()
{
dynamic obj=new ExpandoObject {Field1=1,Field2=2};
return Json(obj);
}