复选框 用于使用反射

本文关键字:反射 用于 复选框 | 更新日期: 2023-09-27 17:56:35

我正在尝试调用:

InputExtensions.CheckBoxFor(h, (dynamic)GetBoolParameterByName(model, propInfo));

这是我在表达式方面的尝试。

public Expression GetBoolParameterByName(T source, PropertyInfo pi)
        {
            var param = Expression.Parameter(typeof(T), "p");
            Expression body = param;
            typeof (Nullable<>).GetMethod("GetValueOrDefault", BindingFlags.Instance | BindingFlags.Public, Type.DefaultBinder,
                new Type[] {typeof (bool)}, null);
            var func = typeof(Nullable<bool>).GetMethod("GetValueOrDefault", BindingFlags.Instance | BindingFlags.Public, Type.DefaultBinder,
                new Type[] { typeof(bool) }, null);
            body = MethodCallExpression.Call(Expression.PropertyOrField(body, pi.Name), func, Expression.Constant(false));
            return Expression.Lambda(body, param);  
        }

我认为这会起作用,因为 CheckboxFor 需要 Func<T,bool> 的表达式,但我不断得到

'Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions.'

谁能解释一下这个错误是什么以及我可以做些什么来解决这个问题?

复选框 用于使用反射

我认为GetBoolParameterByName方法没有任何问题。唯一可能的问题可能是将不属于 bool? 类型(如 ID)的属性的PropertyInfo传递给它。

我实际上想通了,CheckBoxFor 不接受 p.prop.GetValueOrDefault() 你必须做 p=>p.prop.Value。 尽管您必须确保覆盖元素上的名称和 ID 属性,因为您将获得 prop。值而不是道具

var param = Expression.Parameter(typeof(T), "p");
        Expression body = param;
        body = Expression.MakeMemberAccess(Expression.PropertyOrField(body, pi.Name), pi.PropertyType.GetMember("Value").First());
        return Expression.Lambda(body, param);