复选框 用于使用反射
本文关键字:反射 用于 复选框 | 更新日期: 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);