C# 编译器错误:无法转换 lambda 表达式
我尝试使用 Lambda 表达式和反射来获取成员层次结构名称(而不是使用文本常量),以便在我的控件绑定信息无效时强制执行编译时错误。
这是一个 ASP.NET MVC 项目,但它不是 MVC 特定的问题 AFAIK。编辑:具体来说,我希望以下内容评估为 true:
string fullname = GetExpressionText(model => model.Locations.PreferredAreas);
"Locations.PreferredAreas" == fullname;
相反,我收到编译错误:
错误 4:无法将 lambda 表达式转换为类型 “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...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
错误信息是正确的。 lambda 可以转换为兼容委托类型 D,或转换为兼容委托类型的表达式
Expression
。Expression>
就是其中之一。 “LambdaExpression”都不是这些。因此,在尝试将 lambda 转换为 LambdaExpression,而不是实际的表达式树类型时,您会收到错误消息。那里一定有一个代表。The error message is correct. A lambda can be converted to a compatible delegate type, D, or to an expression-of-compatible-delegate-type
Expression<D>
.Expression<Func<TM, TP>>
is one of those. "LambdaExpression" is neither of those. Therefore you get an error trying to convert the lambda to LambdaExpression, but not to an actual expression tree type. There has to be a delegate in there somewhere.在尝试修复 lambda 表达式之前,请确保已添加以下引用:
缺少这些引用也可能会导致相同的错误(“无法将 lambda 表达式转换为类型“System.Linq.Expressions.Lambda Expression”,因为它不是委托类型” “)。
Before trying to fix the lambda expressions, be sure that the following references have already been added:
The lack of these references may cause the same error as well ("Cannot convert lambda expression to type 'System.Linq.Expressions.Lambda Expression' because it is not a delegate type").
我认为你应该尝试使用这样的辅助方法:
I think you should try to use a helper method like that: