"Numero errato di parametri forniti per la dichiarazione lambda"

c# expression expression-trees func

Domanda

Quando ho questo,

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

questo funziona:

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

Ma quando ho questo,

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

questo fallisce:

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

Ricevo Un'eccezione non gestita di tipo "System.ArgumentException" verificatasi in System.Core.dll. Ulteriori informazioni: numero errato di parametri forniti per la dichiarazione lambda . Il parametro t è solo un'espressione per un manichino tipo Foo . Penso che sia irrilevante. Dove sono andato storto qui?

Risposta accettata

Il problema è che hai detto che vuoi usare un parametro, ma in realtà non stai fornendo nulla per specificarlo. Stavi creando due ParameterExpression di tipi diversi, e poi provando a convertire il risultato in un Func<object> - che non ha alcun parametro. Vuoi qualcosa come:

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

Si noti che la stessa ParameterExpression viene utilizzata nell'elenco degli argomenti sia per il metodo Expression.Call per i metodi Expression.Lambda .



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché