如何为反射属性构建表达式

时间:2012-06-11 19:38:58

标签: c# asp.net-mvc reflection expression-trees

我用这个签名构建了一个MVC Html助手:

  public static MvcHtmlString EditFieldFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, object additionalViewData = null)

我正在尝试构建另一个帮助器,它将反映对象的属性,然后为每个反射的属性调用EditFieldFor。但正如您所看到的,该方法需要一个表达式。

如何将PropertyInfo转换为表达式?

1 个答案:

答案 0 :(得分:2)

This answer告诉我该怎么做。这是我做的:

foreach (var propertyInfo in editFields)
{
    var expParam = Expression.Parameter(typeof(TModel)); // TModel is a generic parameter on this method
    var expProp = Expression.Property(expParam, propertyInfo);
    var expression = Expression.Lambda(expProp, expParam);

    var fieldHtml = (MvcHtmlString)typeof (HtmlHelpers)
        .GetMethod("EditFieldFor")
        .MakeGenericMethod(typeof (TModel), propertyInfo.PropertyType)
        .Invoke(null, new object[] {html, expression, null});

    editFormHtml.Append(fieldHtml);
}