You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复MudBlazor DataGrid动态列的Expression<Func<T,P>>方法异常?

修复MudBlazor DataGrid动态PropertyColumn的表达式错误

问题根源

你的MakeExpression方法泛型参数T被约束为Type,传入的Model.ModelClass.Object是目标实体的类型对象(Type实例),但动态表达式解析时会错误地把T当成要访问属性的实体类型,导致去Type类里查找String1属性,自然找不到对应成员,抛出异常。

修复方案

调整MakeExpression的实现,直接基于传入的实体类型创建表达式,而非把类型对象作为泛型参数。以下提供两种可行写法:

写法1:手动构建表达式(无需依赖Dynamic.Core)

<MudDataGrid @ref=_grid Items="GetItems(Model.ModelClass.Object, Items)">
    <Columns>
       @foreach(ListViewColumn col in Listview.Columns.OrderBy(x => x.Index))
        {
            <PropertyColumn Property="@MakeExpression(col, Model.ModelClass.Object)" Title="@col.Caption" />
        }
    </Columns>
</MudDataGrid>
@code{
    private Expression<Func<object, object>> MakeExpression(ListViewColumn col, Type entityType)
    {
        // 创建代表实体实例的参数表达式
        var parameter = Expression.Parameter(entityType, "x");
        // 获取目标属性的表达式
        var property = Expression.Property(parameter, col.PropertyName);
        // 值类型属性需要装箱为object,避免类型不匹配
        var convert = Expression.TypeAs(property, typeof(object));
        // 构建最终的Lambda表达式
        return Expression.Lambda<Func<object, object>>(convert, parameter);
    }
}

写法2:继续使用System.Linq.Dynamic.Core

<MudDataGrid @ref=_grid Items="GetItems(Model.ModelClass.Object, Items)">
    <Columns>
       @foreach(ListViewColumn col in Listview.Columns.OrderBy(x => x.Index))
        {
            <PropertyColumn Property="@MakeExpression(col, Model.ModelClass.Object)" Title="@col.Caption" />
        }
    </Columns>
</MudDataGrid>
@code{
    private Expression<Func<object, object>> MakeExpression(ListViewColumn col, Type entityType)
    {
        var text = $"x => x.{col.PropertyName}";
        // 指定实体类型作为输入,object作为输出解析表达式
        var lambda = System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(entityType, typeof(object), text);
        return (Expression<Func<object, object>>)lambda;
    }
}

关键说明

  • 不再将Type作为泛型参数,而是直接接收实体类型Type作为方法参数
  • 确保表达式的参数是实体实例而非类型对象,让动态解析逻辑能正确定位到实体的属性
  • 对值类型属性添加装箱转换,保证与Func<object, object>的返回类型匹配

内容的提问来源于stack exchange,提问作者Michael de Vlieger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:20:09