Было бы лучше применить подпись exp
как можно раньше - то есть как Expression<Func<string>>
public string Return(Expression<Func<string>> expression)
{
return expression.Compile()();
}
либо:
SimpleClass sc = new SimpleClass();
string result = sc.Return(() => sc.ReturnString("hello world"));
Console.WriteLine(result);
или
SimpleClass sc = new SimpleClass();
Expression expression = Expression.Call(
Expression.Constant(sc), // target-object
"ReturnString", // method-name
null, // generic type-argments
Expression.Constant("hello world") // method-arguments
);
var lambda = Expression.Lambda<Func<string>>(expression);
string result = sc.Return(lambda);
Console.WriteLine(result);
Конечно, использование делегата (Func<string>
) может работать так же хорошо во многих сценариях.