Alternatives de ComstackToMethod dans .Net Standard

Je porte maintenant une bibliothèque qui utilise des expressions dans une application .Net Core et j’ai rencontré un problème selon lequel toute ma logique est basée sur LambdaExpression.ComstackToMethod qui manque tout simplement. Voici un exemple de code:

 public static MethodInfo ComstackToInstanceMethod(this LambdaExpression expression, TypeBuilder tb, ssortingng methodName, MethodAtsortingbutes atsortingbutes) { ... var method = tb.DefineMethod($"__StaticProxy", MethodAtsortingbutes.Private | MethodAtsortingbutes.Static, proxy.ReturnType, paramTypes); expression.ComstackToMethod(method); ... } 

Est-il possible de le réécrire pour permettre de générer des méthodes à l’aide d’Expressions? Je peux déjà le faire avec Emit mais c’est assez complexe et j’aimerais l’éviter en faveur d’expressions de haut niveau.

J’ai essayé d’utiliser var method = expression.Comstack().GetMethodInfo(); mais dans ce cas je reçois une erreur:

System.InvalidOperationException: impossible d’importer une méthode globale ou un champ à partir d’un module différent.

Je sais que je peux émettre manuellement IL, mais j’ai besoin de convertir exactement Expression -> en MethodInfo à MethodInfo spécifique TypeBuilder lieu de me construire lui-même DynamicMethod .

J’ai rencontré le même problème lors du portage de code sur Netstandard. Ma solution consistait à comstackr le lambda en un Func à l’aide de la méthode Comstack, à stocker le Func dans un champ statique que j’avais ajouté à mon type dynamic, puis dans ma méthode dynamic, je chargeais simplement et appelais le Func à partir de ce champ statique. Cela me permet de créer le lambda à l’aide des API d’expression LINQ au lieu d’émettre des reflections (ce qui aurait été pénible), mais mon type dynamic implémentera toujours une interface (ce qui était une autre exigence de mon scénario).

On se croirait dans un bidouillage, mais cela fonctionne et est probablement plus facile que d’essayer de recréer la fonctionnalité ComstackToMethod via LambdaComstackr.

Ce n’est pas une solution idéale mais cela vaut la peine d’envisager si vous ne voulez pas tout écrire à partir de rien:

  1. Si vous regardez l’implémentation de ComstackToMethod , vous verrez que sous le capot, il utilise la classe interne LambdaComstackr .
  2. Si vous creusez encore plus profondément, vous verrez que LambdaComstackr utilise System.Reflection.Emit pour convertir les lambdas en MethodInfo .
  3. System.Reflection.Emit est pris en charge par .NET Core.
  4. Compte tenu de cela, ma proposition est d’essayer de réutiliser le code source LambdaComstackr . Vous pouvez le trouver ici .

Le plus gros problème avec cette solution est que:

  1. LambdaComstackr est réparti sur de nombreux fichiers, il peut donc être fastidieux de trouver ce qui est nécessaire pour le comstackr.
  2. LambdaComstackr peut utiliser certaines API qui ne sont pas du tout supscopes par .NET Core.

Quelques commentaires supplémentaires:

  1. Si vous souhaitez vérifier quelle API est prise en charge par quelle plate-forme, utilisez le catalogue des API .NET .
  2. Si vous souhaitez voir des différences entre les versions standard .NET, utilisez ce site.