Asp.net mvc 使用参数编译Lambda表达式

Asp.net mvc 使用参数编译Lambda表达式,asp.net-mvc,lambda,extension-methods,func,Asp.net Mvc,Lambda,Extension Methods,Func,我想用助手扩展MVC。假设我想构建一个扩展方法,该方法从模型中获取一个属性并呈现一个段落 我已经写了这段代码,但无法编译。我不知道怎么做: public static class PExtension { public static string PFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) wh

我想用助手扩展MVC。假设我想构建一个扩展方法,该方法从模型中获取一个属性并呈现一个段落

我已经写了这段代码,但无法编译。我不知道怎么做:

public static class PExtension
{
    public static string PFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) where TModel: class 
    {
        var f = expression.Compile();
        // won't compile the line below:
        string propretyValue = f();
        return "<p>" + propretyValue + "</p>";
    }
}
谢谢

编辑
错误说明:
*委托“Func”不接受0个参数*

表达式参数指定表达式的返回值为TValue,但您正在尝试将编译表达式的返回值分配给字符串。我猜编译错误是关于“无法将TValue转换为字符串”的

请尝试以下方法:

object propertyValue = f();
return string.Format( "<p>{0}</p>", propertyValue != null ? propertyValue.ToString() : string.Empty );
所以试试这个:

ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
object propertyValue = f((TModel)metadata.Model);
return string.Format( "<p>{0}</p>", propertyValue != null ? propertyValue.ToString() : string.Empty );
modelmatadata=modelmatadata.FromLambdaExpression(表达式,htmlhelp.ViewData);
objectpropertyvalue=f((TModel)metadata.Model);
返回string.Format(“{0}

”,propertyValue!=null?propertyValue.ToString():string.Empty);
最后,代码如下所示:

 public static class PExtension
    {
        public static MvcHtmlString PFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) where TModel : class
        {
            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);

            return MvcHtmlString.Create(string.Format("<p>{0}</p>", metadata.Model != null ? metadata.Model.ToString() : string.Empty));
        }
    }
公共静态类扩展
{
公共静态MvcHtmlString PFor(此HtmlHelper html,表达式),其中TModel:class
{
ModelMetadata=ModelMetadata.FromLambdaExpression(表达式,html.ViewData);
返回MvcHtmlString.Create(string.Format(“{0}

”,metadata.Model!=null?metadata.Model.ToString():string.Empty)); } }
太好了,我会发布一个答案,稍加修改,但你给我指出了正确的方向。谢谢
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
object propertyValue = f((TModel)metadata.Model);
return string.Format( "<p>{0}</p>", propertyValue != null ? propertyValue.ToString() : string.Empty );
 public static class PExtension
    {
        public static MvcHtmlString PFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression) where TModel : class
        {
            ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);

            return MvcHtmlString.Create(string.Format("<p>{0}</p>", metadata.Model != null ? metadata.Model.ToString() : string.Empty));
        }
    }