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

vfwfrxfs  于 2023-02-14  发布在  C#
关注(0)|答案(3)|浏览(259)

我尝试使用Lambda表达式和反射来获取成员层次名称(而不是使用文本常量),以便在控件绑定信息无效时强制执行编译时错误。
这是一个ASP.NET MVC项目,但不是MVC特定的问题。具体地说,我希望以下表达式的值为true:

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

相反,我得到了一个编译错误:
错误4:无法将lambda表达式转换为类型“System.Linq.Expression.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.NETMVCCodeplex项目中的相关代码,在我看来它传递了相同的参数给相同的方法:

// 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...
qxsslcnc

qxsslcnc1#

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

tktrz96b

tktrz96b2#

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

    • 系统链接;

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

56lgkhnf

56lgkhnf3#

我认为你应该试着使用这样一个helper方法:

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

相关问题