web-dev-qa-db-fra.com

Impossible de convertir l'expression lambda en type 'objet' car ce n'est pas un type délégué

J'ai une classe de base qui a une propriété bool qui ressemble à ceci:

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

J'en hérite d'une autre classe et j'essaie d'ajouter InProgress en tant que délégué au dictionnaire. Mais cela me jette une erreur. Voici à quoi ressemble ma classe dérivée:

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

}

C'est l'erreur que j'obtiens:

Impossible de convertir l'expression lambda en type 'objet' car ce n'est pas un type délégué

Qu'est-ce que je fais mal ici?

26
Asdfg

Le mieux serait que le dictionnaire soit fortement typé, mais si vous assignez le lambda à un lambda spécifique (délégué), cela devrait fonctionner (car le compilateur connaît alors le format du délégué):

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

Ou en le lançant directement, même effet

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

Bien sûr, avoir un tel format de dictionnaire comme objet est discutable, car vous devrez connaître le format de délégué pour pouvoir l'utiliser.

23
Me.Name

J'ai eu cette erreur quand je manquais

using System.Data.Entity;
10
Craig Howard

Bien que la solution de @ Me.Name soit tout à fait valable en soi, il existe une astuce supplémentaire qui peut être utile dans certaines situations (cela m’a certainement bien fonctionné): peut considérer le casting comme une méthode d’aide, dans le sens de

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

puis appelez-le simplement

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

Vous gagnerez peut-être du temps par la suite. Si vous décidez de modifier les signatures, vous devrez le faire à un seul endroit.

2
vaxquis

J'ai rencontré ce problème en écrivant des tests unitaires. J'essayais de simuler le comportement d'une base de données pour renvoyer un nouvel objet depuis un référentiel au lieu de se connecter à une base de données.

Assurez-vous que votre objet a un constructeur utilisable. Vous ne pourrez peut-être pas instancier correctement cet objet comme vous le souhaitez. Si vous utilisez un lambda pour indiquer un constructeur, assurez-vous qu'il peut être appelé de la même manière dans une instruction d'instanciation normale.

c'est à dire.

return x => new FakeObject();

dire dans le cas de

var fake = new FakeObject();

ne fonctionnerait pas alors le lambda échouera aussi alors soyez prudent.

0
David Hunsicker