复选框用于使用反射

时间:2014-04-04 16:51:33

标签: c# asp.net-mvc-4

我试图打电话:

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.'

任何人都可以解释这个错误是我能做些什么来解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我在GetBoolParameterByName方法中看不到任何问题。唯一可能的问题可能是您将PropertyInfo属性类型bool?(例如ID)传递给它。

答案 1 :(得分:0)

我实际上想出来了,CheckBoxFor不接受p.prop.GetValueOrDefault()你必须做p =&gt; p.prop.Value。虽然您必须确保覆盖元素上的名称和ID属性,因为您将获得prop.Value而不是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);