Подтвердить что ты не робот

Невозможно преобразовать лямбда-выражение, чтобы набрать "объект", потому что это не тип делегата

У меня есть базовый класс, который имеет свойство bool, которое выглядит следующим образом:

public abstract class MyBaseClass
{
     public bool InProgress { get; protected set; }
}

Я наследую его от другого класса и пытаюсь добавить InProgress в качестве делегата в словарь. Но это вызывает у меня ошибку. Так выглядит класс Derived:

public abstract class MyClass
{
     Dictionary<string, object> dict = new Dictionary<string, object>();
     dict.Add("InProgress", InProgress => base.InProgress = InProgress);

}

Это ошибка, которую я получаю:

Невозможно преобразовать лямбда-выражение в тип 'object', потому что это не тип делегата

Что я здесь делаю неправильно?

4b9b3361

Ответ 1

Лучше всего было бы строго набрать словарь, но если вы сначала назначите лямбда определенному лямбда (делегату), он должен работать (потому что компилятор тогда знает формат делегата):

        Action<bool> inp = InProgress => base.InProgress = InProgress;
        dict.Add("InProgress", inp);

Или путем его литья непосредственно, тот же эффект

       dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));

Конечно, такой формат словаря, как объект, можно обсуждать, так как вам нужно будет знать формат делегата, чтобы иметь возможность его использовать.

Ответ 2

Хотя решение by @Me.Name полностью само по себе, есть дополнительный трюк, который может пригодиться в некоторых ситуациях (это, безусловно, для меня): если вы конвертируете несколько лямбда с помощью этой техники, вы можете коэффициент приведения в качестве вспомогательного метода по линиям

object myDelegateToObject ( Action<bool> action ) {
    return action; // autocast to `object` superclass, no explicit cast needed
}

а затем назовите его просто

dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));

Это может сэкономить ваше время позже - если вы решите изменить для изменения подписей, вам нужно будет сделать это только в одном месте.

Ответ 3

Я получил эту ошибку, когда я отсутствовал

using System.Data.Entity;

Ответ 4

Я столкнулся с этой проблемой при написании модульных тестов. Я пытался издеваться над поведением базы данных, чтобы вернуть новый объект из репозитория вместо фактического подключения к базе данных.

Убедитесь, что у вашего объекта есть полезный конструктор. Возможно, вы не сможете успешно создать экземпляр этого объекта так, как хотите. Убедитесь, что вы используете лямбда для указания на конструктор, который конструктор может быть вызван таким же образом в обычном заявлении о создании.

то есть.

return x => new FakeObject();

говорят в случае

var fake = new FakeObject();

не будет работать, тогда лямбда также потерпит неудачу, поэтому будьте осторожны.