"Falsche Anzahl der Parameter für die Lambda-Deklaration"

c# expression expression-trees func

Frage

Wenn ich das habe,

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

das funktioniert:

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

Aber wenn ich das habe,

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

das schlägt fehl:

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

Ich bekomme eine unbehandelte Ausnahme vom Typ "System.ArgumentException" in System.Core.dll aufgetreten. Zusatzinformation: Falsche Anzahl von Parametern für die Lambda-Deklaration . Der Parameter t ist nur Ausdruck für einen Dummy-Typ Foo . Ich denke, das ist irrelevant. Wo bin ich hier falsch gelaufen?

Akzeptierte Antwort

Das Problem ist, dass Sie gesagt haben, dass Sie einen Parameter verwenden möchten - aber Sie geben dann nirgendwo etwas an, um es zu spezifizieren. Sie haben zwei ParameterExpression verschiedener Typen erstellt und dann versucht, das Ergebnis in ein Func<object> zu konvertieren, das überhaupt keine Parameter enthält. Du willst etwas wie:

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

Beachten Sie, dass die ParameterExpression in der Argumentliste für die Expression.Call Methode und die Expression.Lambda Methode verwendet wird.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow