我尝试使用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...
3条答案
按热度按时间qxsslcnc1#
错误消息是正确的。lambda可以转换为兼容的委托类型D或兼容委托类型的表达式
Expression<D>
。Expression<Func<TM, TP>>
是其中之一。“LambdaExpression”不是其中之一。因此,尝试将lambda转换为LambdaExpression而不是实际的表达式树类型时会出错。其中某处必须有 delegate。tktrz96b2#
在尝试修复lambda表达式之前,请确保已添加以下引用:
系统.链接.表达式;**
缺少这些引用也可能导致相同的错误("无法将lambda表达式转换为类型" System.Linq.Expressions.Lambda Expression ",因为它不是委托类型")。
56lgkhnf3#
我认为你应该试着使用这样一个helper方法: