Maison >développement back-end >C++ >Comment puis-je convertir une fonction C# en expression ?

Comment puis-je convertir une fonction C# en expression ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-03 09:25:39931parcourir

How Can I Convert a C# Func to an Expression?

Conversion de C# Func to Expression>

En C#, les expressions lambda offrent un moyen pratique de représenter des fonctions légères. Bien qu'il soit simple de convertir un lambda en un Expression> à l'aide d'un appel de méthode, il peut y avoir des scénarios dans lesquels la conversion d'un Func directement vers une expression est souhaitée.

Le défi

Cependant, une telle conversion directe n'est pas possible en raison d'une erreur de compilation, comme illustré dans le code suivant :

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

L'erreur vient du fait que Func représente un délégué générique plutôt qu'une expression.

Limitations

Malheureusement, il n'existe aucun moyen simple d'obtenir la conversion souhaitée. Tentative d'obtenir l'expression originale à partir d'un Func pourrait s'avérer irréalisable en raison des optimisations et de la perte de données lors de la compilation.

Approches alternatives

Comme alternative, on peut envisager :

  • Utiliser réflexion pour inspecter le Func et déduire son expression prévue.
  • Utiliser un compilateur d'expression personnalisé ou un modèle d'objet dynamique pour créer un arbre d'expression basé sur Func.

Cependant, ces approches impliquent généralement des et des techniques sujettes aux erreurs.

Conclusion

Conversion une fonction à une expression> directement est intrinsèquement difficile en C#. Des approches alternatives peuvent être explorées au prix d'une complexité accrue et de limitations potentielles.

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!

Déclaration:
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