我试图打电话:
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.'
任何人都可以解释这个错误是我能做些什么来解决这个问题吗?
答案 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);