Textarea对于具有反射的可空类型

时间:2014-04-03 17:45:14

标签: c# asp.net-mvc

    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'类型的委托参数

我不确定我在哪里出错,这个错误甚至意味着什么

1 个答案:

答案 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"));        
}