"Nombre incorrect de paramètres fournis pour la déclaration lambda"

c# expression expression-trees func

Question

Quand j'ai ça,

public static object Create()
{
    return new object();
}

cela marche:

var m = typeof(Class).GetMethod("Create");
var e = Expression.Call(m);
Func<object> f = Expression.Lambda<Func<object>>(e).Compile();

Mais quand j'ai ça,

public static object Create(Type t)
{
    return new object();
}

cela échoue:

var m = typeof(Class).GetMethod("Create");
var e = Expression.Call(m, Expression.Parameter(typeof(Type)));
var t = Expression.Parameter(typeof(Foo));
Func<object> f = Expression.Lambda<Func<object>>(e, t).Compile();

Une exception non gérée du type 'System.ArgumentException' s'est produite dans System.Core.dll. Informations complémentaires: Nombre incorrect de paramètres fournis pour la déclaration lambda . Le paramètre t est simplement l'expression d'un type factice Foo . Je pense que ce n'est pas pertinent. Où est-ce que je me suis trompé ici?

Réponse acceptée

Le problème est que vous avez dit que vous souhaitiez utiliser un paramètre, mais vous ne fournissez pas de paramètre pour le spécifier. Vous créiez deux types ParameterExpression de types différents, puis tentiez de convertir le résultat en un Func<object> - sans aucun paramètre. Vous voulez quelque chose comme:

var m = typeof(Class).GetMethod("Create");
var p = Expression.Parameter(typeof(Type), "p");
var e = Expression.Call(m, p);
Func<Type, object> f = Expression.Lambda<Func<Type, object>>(e, p).Compile();

Notez que la même ParameterExpression est utilisée dans la liste d'arguments pour les méthodes Expression.Call et Expression.Lambda .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow