Heim > Backend-Entwicklung > C++ > Wie konvertiere ich eine .NET-Funktion in einen Ausdruck?

Wie konvertiere ich eine .NET-Funktion in einen Ausdruck?

Patricia Arquette
Freigeben: 2025-01-05 16:20:40
Original
307 Leute haben es durchsucht

How to Convert a .NET Func to an Expression?

Konvertieren eines .NET Func in einen .NET-Ausdruck>

In .NET kann ein Lambda-Ausdruck einfach in einen Ausdruck<> umgewandelt werden. mit der Expression-Klasse. Es kann jedoch Fälle geben, in denen man einen Func zurück in einen Ausdruck>.

Betrachten Sie den folgenden Code:

public void GimmeExpression(Expression<Func<T>> expression)
{
    ((MemberExpression)expression.Body).Member.Name; // "DoStuff"
}

public void SomewhereElse()
{
    GimmeExpression(() => thing.DoStuff());
}
Nach dem Login kopieren

Hier wird ein Lambda-Ausdruck an die GimmeExpression-Methode übergeben, die den Namen des extrahiert aufgerufene Methode (DoStuff).

Angenommen, wir möchten einen ähnlichen Vorgang ausführen, jedoch in eingeschränkter Form Kontext:

public void ContainTheDanger(Func<T> dangerousCall)
{
    try 
    {
        dangerousCall();
    }
    catch (Exception e)
    {
        // This next line does not work...
        Expression<Func<T>> DangerousExpression = dangerousCall;
        var nameOfDanger = 
            ((MemberExpression)dangerousCall.Body).Member.Name;
        throw new DangerContainer(
            "Danger manifested while " + nameOfDanger, e);
    }
}

public void SomewhereElse()
{
    ContainTheDanger(() => thing.CrossTheStreams());
}
Nach dem Login kopieren

In diesem Fall versuchen wir, die gefährliche Call Func in einen Ausdruck> umwandeln, aber wir stoßen auf einen Fehler bei der Kompilierung:

Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.
Nach dem Login kopieren

Dies liegt daran, dass Func stellt eher einen generischen Delegaten als einen Ausdruck dar. Während der Compiler Lambdas auf magische Weise in Ausdruck konvertieren kann<> Für allgemeine Func-Objekte ist diese Konvertierung nicht möglich. Objekte.

Das Zerlegen der Zwischensprache (IL) und das Ableiten des ursprünglichen Ausdrucks könnte diese Konvertierung ermöglichen, wenn die erforderlichen Daten nicht wegoptimiert wurden. Dies ist jedoch ein komplexer und möglicherweise unzuverlässiger Ansatz.

Das obige ist der detaillierte Inhalt vonWie konvertiere ich eine .NET-Funktion in einen Ausdruck?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage