Sto cercando di capire come mettere insieme tutti i pezzi e apprezzerei un esempio di codice sorgente concreto per un caso semplice con cui iniziare.C# 4 "dinamico" negli alberi di espressione
Si consideri il seguente codice C#:
Func<int, int, int> f = (x, y) => x + y;
posso produrre una funzione equivalente in fase di esecuzione utilizzando alberi di espressione come segue:
var x = Expression.Parameter(typeof(int), "x");
var y = Expression.Parameter(typeof(int), "y");
Func<int, int, int> f =
Expression.Lambda<Func<int, int, int>>(
Expression.Add(x, y),
new[] { x, y }
).Compile();
Ora dato il seguente lambda:
Func<dynamic, dynamic, dynamic> f = (x, y) => x + y;
come potrei generare l'equivalente usando gli alberi di espressione (e, presumibilmente, Expression.Dynamic
)?
Fresco, molto interessante. Non sono sicuro che tu abbia risposto alla domanda dell'OP, ma sicuramente la stai affrontando nel modo in cui vorrebbe. –
Meraviglioso, questo è proprio quello che volevo, grazie! Un'altra cosa che non mi è del tutto chiara dall'osservazione dei documenti MSDN per Binder.BinaryOperation (http://msdn.microsoft.com/en-us/library/ee814532.aspx) - qual è il significato del "contesto" parametro? C# usa sempre il nome del tipo di allegato lì? Ha qualche significato semantico speciale oltre a contrassegnare un particolare sito di chiamata come diverso da tutti gli altri siti di chiamata (a fini di memorizzazione nella cache, presumo)? Se, per esempio, ho due metodi in una stessa classe che probabilmente spediranno le stesse cose in modo diverso, creo due classi fittizie? –
@Pavel: Penso che sia usato per determinare quali membri sono accessibili. Ad esempio, se hai 'private void Foo (string s) {} public void Foo (object o) {}', chiamando Foo su una stringa all'interno della classe sceglierà l'overload della stringa, ma al di fuori della classe sceglierà il sovraccarico dell'oggetto . – Quartermeister