Asp.net mvc 我可以为MVC';使用LambdaExpression类型吗;什么是HTML助手?

Asp.net mvc 我可以为MVC';使用LambdaExpression类型吗;什么是HTML助手?,asp.net-mvc,lambda,expression,html-helper,Asp.net Mvc,Lambda,Expression,Html Helper,我正在尝试使用反射自动生成视图Html.DisplayFor和其他一些帮助程序采用Expression,它源自LambdaExpression。看起来我可以手动生成自己的lambda,然后传入,但它抛出了以下错误: 无法从用法推断方法“DisplayExtensions.DisplayFor(HtmlHelper,Expression)”的类型参数。尝试显式指定类型参数` 以下是我的标记: <tr> @foreach (var pi in Model.GetType().Ge

我正在尝试使用反射自动生成视图
Html.DisplayFor
和其他一些帮助程序采用
Expression
,它源自
LambdaExpression
。看起来我可以手动生成自己的lambda,然后传入,但它抛出了以下错误:

无法从用法推断方法“DisplayExtensions.DisplayFor(HtmlHelper,Expression)”的类型参数。尝试显式指定类型参数`

以下是我的标记:

<tr>
    @foreach (var pi in Model.GetType().GetProperties())
    {
        <td>
            @Html.DisplayFor(ExpressionHelpers.GetPropertyGetterLambda(pi))
        </td>
    }
</tr>

我首先推荐另一种解决方案。将for循环更改为
DisplayForModel
调用:

@Html.DisplayForModel()
这将在内部使用
DisplayFor
呈现所有属性。您可以通过修改
DisplayTemplates
文件夹中的
Object.cshtml
来修改它(在您正在使用的
Views
文件夹中,或者在
Shared
文件夹中全局应用)

如果这还不够,或者您确实想使用
LambdaExpression
,这里有一个替代方案。它需要您添加一个
DisplayFor(LambdaExpression表达式)
扩展方法。它可能是这样的(注意,我还没有实际测试过这个,但这接近于所需要的):

public static IHtmlString DisplayFor(此HtmlHelper,LambdaExpression表达式)
{
var wrapperClass=typeof(DisplayExtensions);
///查找方法的匹配项
var matchingMethod=wrapperClass.GetMethods()
.单个(c=>c.IsStatic
&&c.名称==“DisplayFor”
&&c.GetGenericArguments().Count()==2
&&c.GetParameters().Count()==2//重载没有相同的参数。这应该足够了。
).MakeGenericMethod(typeof(TModel),expression.ReturnType);//从TModel和返回类型生成泛型类型
//调用该方法。结果已经是一个IHtmlString,所以只需强制转换即可。
return(IHtmlString)matchingMethod.Invoke(null,新对象[]{helper,expression});
}

您能展示该方法的实现吗?@EhsanSajjad updated您的第二个解决方案基本上就是我要依赖的,但是在运行时使用反射生成带有表达式树的委托。“我不认为他第一个会在我的情况下起作用,但很高兴知道这一点。”“你为什么认为第一个不会起作用?”?
@Html.DisplayForModel()
    public static IHtmlString DisplayFor<TModel>(this HtmlHelper<TModel> helper, LambdaExpression expression)
    {
        var wrapperClass = typeof(DisplayExtensions);
        ///find matching DisplayFor<TModel, TProperty> method
        var matchingMethod = wrapperClass.GetMethods()
            .Single( c => c.IsStatic 
                && c.Name == "DisplayFor"
                && c.GetGenericArguments(  ).Count() == 2 
                && c.GetParameters(  ).Count() == 2 //overloads don't have same # of parameters. This should be sufficient.
                ).MakeGenericMethod( typeof(TModel), expression.ReturnType ); //Make generic type from the TModel and the Return Type

        //invoke the method. The result is a IHtmlString already, so just cast.
        return (IHtmlString) matchingMethod.Invoke( null, new Object[] { helper, expression } );
    }