.NET 的 ListView、GridView 等控件可以通过绑定数据源的方式,显示数据。
那可以绑定 ExpandoObject 吗?
因为 ExpandoObject 可以自由添加属性,也就是说我们在编译阶段,并不知道有哪些属性,只有在运行的时候才知道,这样可以实现更灵活的高级功能。
// 不行。 dynamic d = new ExpandoObject(); d.Id = 1; // 转换成 IDictionary 操作也不行。 // 行。 var d= new { Id = 1}; // 匿名类。
很遗憾。
ListView、GridView 不认 List<ExpandoObject>、ExpandoObject。
错误信息:DataBinding:“System.Dynamic.ExpandoObject”不包含名为“Xxx”的属性。
这是因为 ExpandoObject 的核心是 IDictionary,它与匿名类是两回事。
那我可以用 Dictionary、KeyValuePair 吗?
很遗憾 ListView、GridView 是根据对象的属性名来匹配的,并不会根据 dictionary.Name 去匹配,再去读 dictionary.Value。
KeyValuePair 也是一样的,不可用。
那可以用 dynamic 吗?
准确的说,这句话有问题,dynamic 是一种声明方式,就像 var 一样。
用 dynamic 去声明数据源对象,是没有问题的。