我试图使用Lambda表达式和反射来获取成员的层次结构名称(而不是使用文本常量),以在编译时检测控件绑定信息是否无效。
这是一个ASP.NET MVC项目,但据我所知它不是一个MVC特定的问题。编辑:具体来说,我希望以下内容能够评估为真:
以下是 ASP.NET MVC Codeplex 项目相关代码。我认为它似乎将同一参数传递给同一方法:
这是一个ASP.NET MVC项目,但据我所知它不是一个MVC特定的问题。编辑:具体来说,我希望以下内容能够评估为真:
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...