Я пытаюсь использовать лямбда-выражение и отражение, чтобы получить иерархическое имя члена (вместо использования текстовой константы), для принудительного применения ошибок времени компиляции, если моя управляющая привязка неверна.
Этонаходится в проекте ASP.NET MVC, но это не специфичный для MVC вопрос AFAIK.РЕДАКТИРОВАТЬ: В частности, я хочу, чтобы следующие значения для истины:
string fullname = GetExpressionText(model => model.Locations.PreferredAreas);
"Locations.PreferredAreas" == fullname;
Вместо этого я получаю ошибку компиляции:
Ошибка 4: Невозможно преобразовать лямбда-выражение в тип '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...