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

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

Patricia Arquette
Patricia ArquetteOriginal
2025-01-05 16:20:40316Durchsuche

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());
}

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());
}

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.

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!

Stellungnahme:
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