Maison > développement back-end > C++ > Comment convertir une fonction .NET en expression ?

Comment convertir une fonction .NET en expression ?

Patricia Arquette
Libérer: 2025-01-05 16:20:40
original
263 Les gens l'ont consulté

How to Convert a .NET Func to an Expression?

Conversion d'une fonction .NET en une expression .NET>

Dans .NET, une expression lambda peut être facilement convertie en une expression<> en utilisant la classe Expression. Cependant, il peut y avoir des cas où l'on souhaite convertir un Func retour dans une Expression>.

Considérez le code suivant :

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

public void SomewhereElse()
{
    GimmeExpression(() => thing.DoStuff());
}
Copier après la connexion

Ici, une expression lambda est passée à la méthode GimmeExpression, qui extrait le nom du méthode étant appelée (DoStuff).

Maintenant, supposons que nous voulions effectuer une opération similaire mais dans un cadre restreint context:

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());
}
Copier après la connexion

Dans ce cas, nous essayons de convertir le dangereuxCall Func dans une Expression>, mais nous rencontrons une erreur de compilation :

Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.
Copier après la connexion

C'est parce que Func représente un délégué générique plutôt qu'une expression. Alors que le compilateur peut convertir comme par magie les lambdas en Expression<> objets, cette conversion n'est pas possible pour les objets Func objets.

Désassembler le langage intermédiaire (IL) et déduire l'expression originale pourrait permettre cette conversion si les données nécessaires n'ont pas été optimisées. Cependant, il s'agit d'une approche complexe et potentiellement peu fiable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal