I have a base class that has a bool property which looks like this:
public abstract class MyBaseClass
{
public bool InProgress { get; protected set; }
}
I am inheriting it another class from it and trying to add InProgress as a delegate to the dictionary. But it throws me an error. This is how my Derived class looks like:
public abstract class MyClass
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("InProgress", InProgress => base.InProgress = InProgress);
}
This is the error I am getting:
Cannot convert lambda expression to type 'object' because it is not a delegate type
What am I doing wrong here?
Best would be to have the dictionary strongly typed, but if you assign the lambda to a specific lambda (delegate) first, it should work (because the compiler then knows the delegate format):
Action<bool> inp = InProgress => base.InProgress = InProgress;
dict.Add("InProgress", inp);
Or by casting it directly, same effect
dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));
Of course having such a dictionary format as object is discussable, since you'll have to know the delegate format to be able to use it.
I got this error when I was missing
using System.Data.Entity;
Although the solution by @Me.Name is completely valid by itself, there's an additional trick that may come in handy in some situations (it certainly did for me): if you're converting multiple lambdas using this technique, you can factor the cast as a helper method, along the lines of
object myDelegateToObject ( Action<bool> action ) {
return action; // autocast to `object` superclass, no explicit cast needed
}
and then call it by simply
dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));
It may save you time later on - if you decide to change to change the signatures, you will have to do so in one place only.
I ran into this problem while writing unit tests. I was attempting to mock the behavior of a database to return a new object from a repository instead of actually connecting to a database.
Make sure your object has a usable constructor. You may not be able to successfully instantiate that object the way you want to. Ensure if you using a lambda to point to a constructor that the constructor can be called in the same way in a normal instantiation statement.
i.e.
return x => new FakeObject();
say in the case of
var fake = new FakeObject();
would not work then the lambda will also fail so be careful.