C# 使用反射的复选框

C# 使用反射的复选框,c#,asp.net-mvc-4,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");

我想打电话:

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);  
        }
公共表达式GetBoolParameterByName(T源代码,PropertyInfo pi)
{
var param=表达式参数(类型(T),“p”);
表达式body=param;
typeof(Nullable).GetMethod(“GetValueOrDefault”,BindingFlags.Instance | BindingFlags.Public,Type.DefaultBinder,
新类型[]{typeof(bool)},null);
var func=typeof(Nullable).GetMethod(“GetValueOrDefault”,BindingFlags.Instance | BindingFlags.Public,Type.DefaultBinder,
新类型[]{typeof(bool)},null);
body=MethodCallExpression.Call(Expression.PropertyOrField(body,pi.Name),func,Expression.Constant(false));
返回表达式.Lambda(body,param);
}
我想这是可行的,因为CheckboxFor的表达式是
Func
,但我一直在使用它

“模板只能与字段访问、属性访问、一维数组索引或单参数自定义索引器表达式一起使用。”


有人能解释一下这个错误是什么吗?我能做些什么来解决这个问题?

我在
GetBoolParameterByName
方法中没有发现任何问题。唯一可能的问题可能是,您将一个非
bool?
(例如ID)类型的属性的
PropertyInfo
传递给它。

我实际上已经解决了这个问题,CheckBoxFor不接受p.prop.GetValueOrDefault(),您必须执行p=>p.prop.Value。尽管您必须确保覆盖元素上的name和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);

唉,我发现p=>p.prop.GetValueOrDefault()实际上不起作用,我需要做p=>p.prop.Value我只是不知道怎么做,我的尝试是body=Expression.PropertyOrField(Expression.PropertyOrField(body,pi.Name),“Value”);但这似乎不起作用