Ich habe eine Basisklasse, die eine bool -Eigenschaft hat, die wie folgt aussieht:
public abstract class MyBaseClass
{
public bool InProgress { get; protected set; }
}
Ich erbe eine andere Klasse von ihr und versuche, InProgress als Delegierten zum Wörterbuch hinzuzufügen. Aber es wirft einen Fehler. So sieht meine abgeleitete Klasse aus:
public abstract class MyClass
{
Dictionary<string, object> dict = new Dictionary<string, object>();
dict.Add("InProgress", InProgress => base.InProgress = InProgress);
}
Dies ist der Fehler, den ich erhalte:
Der Lambda-Ausdruck kann nicht in den Typ 'object' konvertiert werden, da es sich nicht um einen Delegattyp handelt
Was mache ich hier falsch?
Am besten wäre es, das Wörterbuch stark typisieren zu lassen, aber wenn Sie das Lambda zuerst einem bestimmten Lambda (Delegaten) zuweisen, sollte es funktionieren (da der Compiler dann das Delegatenformat kennt):
Action<bool> inp = InProgress => base.InProgress = InProgress;
dict.Add("InProgress", inp);
Oder durch direktes Gießen, gleicher Effekt
dict.Add("InProgress", (Action<bool>)(InProgress => base.InProgress = InProgress));
Ein solches Wörterbuchformat als Objekt kann natürlich besprochen werden, da Sie das Delegatenformat kennen müssen, um es verwenden zu können.
Ich habe diesen Fehler erhalten, als ich vermisst wurde
using System.Data.Entity;
Obwohl die Lösung von @ Me.Name für sich allein gültig ist, gibt es einen zusätzlichen Trick, der in einigen Situationen nützlich sein könnte (was für mich sicherlich der Fall war): Wenn Sie mehrere Lambdas mit dieser Technik konvertieren, sind Sie es kann die Besetzung als Hilfsmethode nach den Regeln von
object myDelegateToObject ( Action<bool> action ) {
return action; // autocast to `object` superclass, no explicit cast needed
}
und dann einfach anrufen
dict.Add("InProgress", myDelegateToObject(InProgress => base.InProgress = InProgress));
Dadurch sparen Sie später Zeit. Wenn Sie sich entscheiden, die Signatur zu ändern, müssen Sie dies nur an einer Stelle tun.
Ich bin auf dieses Problem gestoßen, als ich Unit-Tests schrieb. Ich habe versucht, das Verhalten einer Datenbank zu verspotten, um ein neues Objekt aus einem Repository zurückzugeben, anstatt tatsächlich eine Verbindung zu einer Datenbank herzustellen.
Stellen Sie sicher, dass Ihr Objekt über einen verwendbaren Konstruktor verfügt. Sie können dieses Objekt möglicherweise nicht auf die gewünschte Weise instanziieren. Stellen Sie sicher, dass Sie, wenn Sie ein Lambda verwenden, um auf einen Konstruktor zu zeigen, dass der Konstruktor in einer normalen Instanziierungsanweisung auf dieselbe Weise aufgerufen werden kann.
d.h.
return x => new FakeObject();
sagen im Fall von
var fake = new FakeObject();
würde nicht funktionieren, dann wird auch das Lambda ausfallen, also sei vorsichtig.