如何修复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
相关产品推荐
相关产品推荐

