delegate
Bu yüzden delegate
nesnesini ilk oluşturduğumda bilmediğim bazı işlevlere işaret eden bir delegate
var. Nesne daha sonra bazı işlevlere ayarlanır.İfade Ağaçları ve Bir Delege İçeren
Ayrıca bir argüman ile delegeyi çağırır bir ifade ağacı yapmak istiyorum (Bu sorunun uğruna argüman 5
olabilir). Bu, uğraştığım şey; Aşağıdaki kod ne istediğimi gösterir ama derleme yapmaz.
Func<int, int> func = null;
Expression<Func<int>> expr =() => func(5);
Bu expr
haline yapar:
() => Invoke(value(Test.Program+<>c__DisplayClass0).func, 5)
görünüyor Hangi
yapabileceğim Bu örnek içinFunc<int, int> func = null;
Expression expr = Expression.Invoke(func, Expression.Constant(5));
(Ben zamanında ifade ağaçlar oluşturmamız gerekir çünkü bu pratiktir) delegate
func
'u kullanmak için, value(Test.Program+<>c__DisplayClass0).func
bitini üretmem gerekiyor.
Peki, nasıl bir temsilci çağrısı yapan bir ifade ağacı yapabilirim?
Action<int> func = i => Console.WriteLine(i * i);
// If func is null like in your example, the GetType() call fails,
// so give it a body or use typeof if you know the type at compile time
var param = Expression.Parameter(func.GetType());
// Call the Invoke method on the delegate, which is the same as invoking() it
var callExpr = Expression.Call(param, func.GetType().GetMethod("Invoke"), Expression.Constant(5));
var lambdaExpr = Expression.Lambda<Action<Action<int>>>(callExpr, param);
var fn = lambdaExpr.Compile(); // Compile the expression tree so it can be executed
fn(func); // Prints 25
İfadeler mindfuck olabilir, ama unutmayın:
[Linq in Action] (http://www.manning.com/marguerie/) İfade ağaçlarının ayrıntılı bir bölümüne sahiptir. –