Çalışma zamanında lambda ifadelerini kullanan bir kod parçam vardı; bunları daha sonra derleyip çağırıyorum. yürütme zaman kazanmak içinBir lambda ifadesinde parametreleri değiştirme
Something thing;
Expression<Action<Something>> expression = (c => c.DoWork());
Delegate del = expression.Compile();
del.DynamicInvoke(thing);
, I, bir önbellekte anahtar lambda ifade dizisi olan bir Dictionary<String, Delegate>
bu derlenmiş temsilci depolanan.
cache.Add("(Something)c => c.DoWork()", del);
Aynı aramalar için, iyi çalıştı. Ancak, aynı delege kullanmam gereken "d => d.DoWork()" gibi eşdeğer lambdalar alabileceğimi fark ettim, ve ben değildim.
Bu bana temiz bir yol olup olmadığını merak ettim ("String.Replace kullanmadı", bunu geçici bir düzeltme olarak yaptım) öğelerini bir lambda ifadesinde değiştirmek için belki de arg0
ile değiştirerek Her iki
(c => c.DoWork())
ve
(d => d.DoWork())
dönüştürülmüş ve karşılaştırılır bir lambda bir Expression.Parameter (Tip, Ad) enjekte etmek fuctionnally benzer bir şey kullanarak (arg0 => arg0.DoWork())
olarak.
Bu mümkün mü? (Cevaplar C# 4.0 içerebilir)
Anahtar her zaman şu şekilde olacaktır: (tür) arg => arg.Method() veya daha karmaşık biçimler bekleniyor? – Elisha
Eh, alınan lambdas, (f, g) => f.Method (g) 'gibi daha fazla paramiye sahip olabilir, ve ben f ve g türleri olacaktır. Anahtar aslında oldukça sıradan ve taş olarak ayarlanmadı, 2 lambdas ('((T) arg0, (V) arg1) => arg0.Method (arg1)' nin yanında eşdeğerliği temsil etmenin herhangi bir uygun yolu hile yapabilirdi anahtar. –