Erstellen Sie eine generische Wrapper-Klasse, die die Methoden mit Lambda-Ausdrücken aufruft

c# expression-trees generics lambda

Frage

Ich habe Schwierigkeiten, eine generische Wrapper-Klasse zu erstellen, die die Methoden mit Lambda-Ausdrücken aufruft.

Der Code sieht so aus:

Die Wrapper-Klasse:

public class Service<T>
{
    private T instance;

    public Service(T param)
    {
        this.instance = param;
    }

    public void Call<U>(Expression<Func<T, U>> aExpression, Action<U> returnClass)
    {
        var methodCallExpr = aExpression.Body as MethodCallExpression
        var lambdaToFunc = Expression.Lambda(methodCallExpr).Compile();
        returnClass((U)lambdaToFunc.DynamicInvoke());
    }
}

Die Klasse, die umhüllt ist:

public class Person
{
    public int GetPersonById(int bbb)
    {
        return bbb;
    }
}

Der Ort, an dem ich den Anruf getätigt habe:

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x =>x.GetPersonById(2),Console.WriteLine);

Ich denke, dass ich die Instanz des Objekts, das " Instanz " ist, an den Methodenausdruck anpassen muss, aber ich weiß nicht wie.

Wenn ich diesen Code ausführe, bekomme ich diese Ausnahme:

Die Variable 'x' vom Typ 'AsynCtry.Person', auf die vom Gültigkeitsbereich '' verwiesen wird, ist jedoch nicht definiert.

Gibt es eine Möglichkeit, dies zu tun?

Akzeptierte Antwort

Sie brauchen dafür keine Ausdrücke - verwenden Sie einfach Delegaten direkt:

public void Call<U>(Func<T, U> aExpression, Action<U> returnClass)
{
    U result = aExpression(this.instance);
    returnClass(result);
}

Ihr Methodenaufruf sollte funktionieren, dann:

var serviceWrapper = new Service<Person>(new Person());
serviceWrapper.Call(x => x.GetPersonById(2), u => Console.WriteLine(u));


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum