В дополнение к замечанию Джима о MakeByRefType вам необходимо создать пользовательский тип делегата, поскольку Func
не поддерживает параметры ref или out.Все вместе:
delegate bool ValidateDelegate(Program program, out bool validatedControlAllowsFocusChange);
static void Main(string[] args)
{
var type = typeof(Program);
var methodInfo = type.GetMethod("ValidateActiveControl", BindingFlags.Instance | BindingFlags.NonPublic);
var p1 = Expression.Parameter(type, "program");
var p2 = Expression.Parameter(typeof(bool).MakeByRefType(), "validatedControlAllowsFocusChange");
var invokeExpression = Expression.Call(p1, methodInfo, p2);
var func = Expression.Lambda<ValidateDelegate>(invokeExpression, p1, p2).Compile();
var validatedControlAllowsFocusChange = true;
// I would expect validatedControlAllowsFocusChange to be false after execution...
Console.WriteLine(func.Invoke(new Program(), out validatedControlAllowsFocusChange));
Console.WriteLine(validatedControlAllowsFocusChange);
}
Редактировать: Это работает в .NET 4.0, но не в .NET 3.5.3.5 Framework не поддерживает деревья лямбда-выражений с параметрами out или ref.Этот код:
delegate void RefTest(out bool test);
static void Main(string[] args)
{
var p1 = Expression.Parameter(typeof(bool).MakeByRefType(), "test");
var func = Expression.Lambda<RefTest>(Expression.Constant(null), p1);
}
выдает исключение ArgumentException «Лямбда-выражение не может содержать передачу по ссылочным параметрам».Я не думаю, что вы можете делать то, что вы хотите без обновления до .NET 4.0.