Je viens de trouver un comportement mystérieux lorsque je travaillais avec System.Linq.Expressions.Expression et System.Reflection.MethodInfo..NET 4.0: Incompatibilité des noms de paramètres entre Expression et MethodInfo
Le code est le suivant:
static void Main(string[] args)
{
Expression<Func<double, double, double>> example = (x, y) => Math.Sin(x);
//Prints out "x, y":
Console.WriteLine(example.Parameters[0].Name + ", " + example.Parameters[1].Name);
//Prints out "a":
Console.WriteLine((example.Body as MethodCallExpression).Method.GetParameters()[0].Name);
}
"a"? Où est passé mon "x" et d'où vient ce "a"? En pensant que c'est peut-être un alias utilisé au niveau bas, j'ai cherché "UsedName", "VisibleName" ou quelque chose comme ça, mais je n'ai rien trouvé.
Malheureusement, Expression
ne dispose pas d'une propriété Parameters
(je crois seulement LambdaExpression
) qui retournerait les "paramètres utilisés", le cas échéant, dans une expression donnée.
On peut créer une méthode qui parcourt toute l'expression et qui recueille les différents paramètres utilisés, mais je me demandais s'il y avait un moyen plus simple de le faire.
Merci beaucoup d'avance.
Visual C# Express: 10.0.30319.1 RTMRel
.NET Framework: 4.0.30319 RTMRel
Maintenant, je comprends que je ne comparais pas vraiment les pommes aux pommes, alors je suis d'accord qu'il n'y a pas d'incohérence. D'un autre côté: pourquoi la distribution? Je peux déjà accéder à 'Parameters',' Body', etc. directement depuis 'example', qui (je crois) est de type' LambdaExpression'. Ce que je pense serait vraiment utile est quelque chose comme ceci: 'ParameterExpression [] paramètres = (anyExpressionInstance comme LambdaExpression) .Parameters.ToArray();'. Dans ce cas précis, '(exemple.Body as LambdaExpression)' deviendrait 'x => Math.Sin (x)', d'où je pourrais récupérer le "paramètre en cours d'utilisation" 'x'. –
@Blas: Vrai - Je lance en raison de votre paragraphe de démarrage "Malheureusement" - mais oui, j'avais oublié que vous avez réellement une «Expression», pas seulement une expression ». Alors oui, vous n'avez pas besoin de la distribution. Je vais modifier ma réponse. Personnellement, je lancerais plutôt que d'utiliser 'as', bien que, dans votre code de commentaire, une exception NullReferenceException ne soit pas aussi utile qu'une' InvalidCastException'. –
@Blas: Il suffit de relire votre commentaire, il semble que vous voulez les * arguments * à l'appel de la méthode. Modification ... –