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

C# show data of ExpandoObject - Cannot convert lambda expression to type '…' because it is not a delegate

我有这个方法:

    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 的数据?

你不能那样做。 IGridColumnCollection.Add 有一个表达式树作为参数:

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

dynamic 不能很好地与表达式树 "built by the compiler" 混合("built by the compiler" 我的意思是表达式树不是通过 Expression class 手动构建的,但是直接在源代码中构建)

(我已经考虑过使用 dynamic 来回答你的其他问题:-))

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

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

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