Не удается преобразовать лямбда-выражение В тип "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, можно обсуждать, так как вам нужно знать формат делегата, чтобы иметь возможность его использовать.
хотя решение по @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();
не будет работать, тогда лямбда также потерпит неудачу, поэтому будьте осторожны.