Ошибка компилятора C #: невозможно преобразовать лямбда-выражение - PullRequest
5 голосов
/ 15 марта 2011

Я пытаюсь использовать лямбда-выражение и отражение, чтобы получить иерархическое имя члена (вместо использования текстовой константы), для принудительного применения ошибок времени компиляции, если моя управляющая привязка неверна.

Этонаходится в проекте 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...

Ответы [ 3 ]

15 голосов
/ 15 марта 2011

Сообщение об ошибке верное. Лямбда может быть преобразована в совместимый тип делегата D или в выражение-совместимого типа делегата Expression<D>. Expression<Func<TM, TP>> является одним из таких. «LambdaExpression» не является ни тем, ни другим. Поэтому вы получаете сообщение об ошибке, пытаясь преобразовать лямбда-выражение в LambdaExpression, но не в фактический тип дерева выражений. Где-то там должен быть делегат .

2 голосов
/ 10 марта 2015

Прежде чем пытаться исправить лямбда-выражения, убедитесь, что следующие ссылки уже добавлены:

System.Linq;
System.Linq.Expressions;

Отсутствие этих ссылок также может привести к той же ошибке ( "Невозможно преобразовать лямбда-выражение в тип 'System.Linq.Expressions.Lambda Expression', так как это не тип делегата" ).

Надеюсь, это поможет ...

2 голосов
/ 15 марта 2011

Я думаю, вы должны попытаться использовать вспомогательный метод, подобный этому:

public static string GetExpressionText<M, P>(this M model, Expression<Func<M, P>> ex)
{
    return GetExpressionText(ex);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...