C#编译器错误:无法转换lambda表达式

时间:2011-03-15 05:56:08

标签: c# asp.net-mvc linq lambda

我正在尝试使用Lambda表达式和反射来获取成员层次结构名称(而不是使用文本常量),以便在控件绑定信息无效时强制执行编译时错误。

这是在ASP.NET MVC项目中,但它不是MVC特定的问题AFAIK。编辑:具体来说,我希望以下评估为真:

string fullname = GetExpressionText(model => model.Locations.PreferredAreas);
"Locations.PreferredAreas" == fullname;

相反,我收到编译错误:

  

错误4:无法将lambda表达式转换为type   'System.Linq.Expressions.LambdaExpression'因为它不是委托类型。

为什么参数在下面的第二种情况下工作,而不是第一种?

// This doesn't compile:
string tb1 = System.Web.Mvc.ExpressionHelper.
    GetExpressionText(model => model.Locations.PreferredAreas);

// But this does:
MvcHtmlString tb2 =
    Html.TextBoxFor(model => model.Locations.PreferredAreas);

这是ASP.NET MVC Codeplex项目的相关代码。在我看来,它将相同的参数传递给相同的方法:

// MVC extension method
public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes) {
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    return TextBoxHelper(
        htmlHelper,
        metadata,
        metadata.Model,
        ExpressionHelper.GetExpressionText(expression),
        htmlAttributes);
}

// MVC utility method
public static string GetExpressionText(LambdaExpression expression) {
    // Split apart the expression string for property/field accessors to create its name
    // etc...

3 个答案:

答案 0 :(得分:15)

错误消息是正确的。 lambda可以转换为兼容的委托类型D,或者转换为兼容表达式类型Expression<D>Expression<Func<TM, TP>>就是其中之一。 “LambdaExpression”既不是那些。因此,尝试将lambda转换为LambdaExpression时会出错,但不会转换为实际的表达式树类型。那里必须有一个委托

答案 1 :(得分:2)

我认为您应该尝试使用这样的辅助方法:

public static string GetExpressionText<M, P>(this M model, Expression<Func<M, P>> ex)
{
    return GetExpressionText(ex);
}

答案 2 :(得分:2)

在尝试修复lambda表达式之前,请确保已添加以下引用:

  

<强> System.Linq的;
  System.Linq.Expressions;

缺少这些引用也可能导致相同的错误(“无法将lambda表达式转换为类型'System.Linq.Expressions.Lambda Expression',因为它不是委托类型”)。

希望这会有所帮助......