C#显示ExpandoObject的数据 - 无法将lambda表达式转换为类型'...',因为它不是委托

时间:2015-02-28 13:31:52

标签: c# expandoobject

我有这个方法:

    public ActionResult dataGrid()
    {
                List<ExpandoObject> list = new List<ExpandoObject>();

                using (OdbcCommand DbCommand = repODBC.dbConnection.CreateCommand())
                {
                    DbCommand.CommandText = "Select * From MyTable";
                    OdbcDataReader reader = DbCommand.ExecuteReader();

                    while (reader.Read())
                    {
                        dynamic obj = new ExpandoObject();
                        obj.name="Peter";
                        obj.num=123;
                        obj.id=1;
                        list.Add(obj);
                    }

                    return View(list);
                }
    }

我尝试以这种方式访问​​数据。我使用Grid.Mvc ......:

@Html.Grid((IEnumerable<System.Dynamic.ExpandoObject>)Model).Columns(columns =>
{
    columns.Add(m => m.id).Titled("ID");
    columns.Add(m => m.name).Titled("Name");
    columns.Add(m => m.num).Titled("OS").Filterable(true);
})

但我收到此错误: 无法将lambda表达式转换为'GridMvc.Columns.IGridColumn'类型,因为它不是委托

如何在网格中添加列以显示ExpandoObject的数据?

1 个答案:

答案 0 :(得分:1)

你不能这样做。 IGridColumnCollection.Add将表达式树作为参数:

IGridColumn<T> Add<TKey>(Expression<Func<T, TKey>> constraint)

dynamic与表达树混合不好&#34;由编译器构建&#34; (由&#34;由编译器构建&#34;我的意思是表达式树不是通过Expression类手动构建的,而是直接在源代码中构建的)

(我已经考虑过将dynamic用于你的另一个问题:-))

现在......您可以尝试使用:

columns.Add(m => ((IDictionary<string, object>)m)["id"]).Titled("ID");

ExpandoObject实现(私下)接口IDictionary<string, object>),但50%它不会工作,并且您将在运行时获得异常。但你可以试试: - )