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

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

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

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

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

}

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

не удается преобразовать лямбда-выражение В тип "object", поскольку оно не является типом делегата

что я делаю не так здесь?

4 ответов


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

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

или путем бросать его сразу, такое же влияние

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

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


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

using System.Data.Entity;

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

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

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

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

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


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

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

то есть

return x => new FakeObject();

скажем в случае

var fake = new FakeObject();

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