public Expression GetValue<T>(T source, PropertyInfo property)
{
ParameterExpression fieldName = Expression.Parameter(pi.PropertyType, pi.Name);
Expression fieldExpr = Expression.PropertyOrField(Expression.Constant(source), pi.Name);
var exp = Expression.Lambda(typeof(Func<,>).MakeGenericType(typeof(T), fieldExpr.Type),
fieldExpr,
fieldName);
return exp;
}
这是我的呼叫功能
public MvcHtmlString RenderModel(T model)
{
foreach (var prop in typeof(T).GetProperties())
{
var x = InputExtensions.TextBoxFor(h, (dynamic) GetValue<T>(model, prop));
}
return new MvcHtmlString(string.Empty);
}
以下是一个示例类:
public class Test
{
public int? ID { get; set; }
public string Name { get; set; }
public DateTime? Date{ get; set; }
}
我从以下部分采用了GetValue: Member Expression cannot convert to object from nullable decimal 这似乎工作得很好,直到你到达不属于对象的属性我得到这个错误:
类型'System.Nullable`1 [System.Int32]'的ParameterExpression不能用于'Test'类型的委托参数
我不确定我在哪里出错,这个错误甚至意味着什么
答案 0 :(得分:0)
如果我理解正确,你需要属性访问lambda。以下是GetValue<T>
方法的正确版本:
public Expression GetValue<T>(T source, PropertyInfo pi)
{
var param = Expression.Parameter(typeof(T), "p");
Expression body = param;
body = Expression.PropertyOrField(body, pi.Name);
return Expression.Lambda(body, param);
}
如果你想通过提供一个委托(在你的问题中它是Expression
)来建立一个Func<T,..>
,那么你也必须提供委托类型,正文表达式和参数表达式:
public Expression GetValue<T>(T source, PropertyInfo property)
{
return Expression.Lambda(
delegateType: typeof(Func<,>).MakeGenericType(typeof(T), pi.PropertyType),
body: Expression.PropertyOrField(Expression.Parameter(typeof(T), "x"), pi.Name),
parameters: Expression.Parameter(typeof(T), "x"));
}