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.
- Comment détecter les modifications apscopes aux propriétés d’un élément dans BindingList ?
- Pourquoi un type jeté ou attrapé doit-il dériver de System.Exception
- Comment désactiver la validation de la demande sans définir RequestValidationMode sur 2.0?
- pourquoi Object.GetType () n’est pas virtuel?
- Que signifie «Remplacer par un seul appel à un seul»?
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:
ComstackToMethod
, vous verrez que sous le capot, il utilise la classe interne LambdaComstackr
. LambdaComstackr
utilise System.Reflection.Emit
pour convertir les lambdas en MethodInfo
. System.Reflection.Emit
est pris en charge par .NET Core. LambdaComstackr
. Vous pouvez le trouver ici . Le plus gros problème avec cette solution est que:
LambdaComstackr
est réparti sur de nombreux fichiers, il peut donc être fastidieux de trouver ce qui est nécessaire pour le comstackr. LambdaComstackr
peut utiliser certaines API qui ne sont pas du tout supscopes par .NET Core. Quelques commentaires supplémentaires: