我有一部分代码,可以在运行时接收Lambda表达式,然后编译并调用它们。
Something thing;
Expression<Action<Something>> expression = (c => c.DoWork());
Delegate del = expression.Compile();
del.DynamicInvoke(thing);
为了节省执行时间,我将这些已编译的委托存储在一个缓存中,它是一个
Dictionary<String, Delegate>
,其中键是lambda表达式字符串。cache.Add("(Something)c => c.DoWork()", del);
对于完全相同的调用,它能够正常工作。但是我意识到我可以接收等效的lambda表达式,例如“d => d.DoWork()”,我实际上应该使用相同的委托,但我没有这样做。
这让我想知道是否有一种干净的方法(即“不使用String.Replace”,我已经暂时解决了这个问题),可以替换lambda表达式中的元素,比如用“arg0”替换它们,以便两者
(c => c.DoWork()) 和 (d => d.DoWork())
通过使用类似于在lambda中注入Expression.Parameter(Type, Name)的功能来转换和比较为(arg0 => arg0.DoWork())。
这可能吗?(答案可以包括C#4.0)
(f,g) => f.Method(g)
,我将拥有f和g的类型。关键是相当平凡的,而且并不是一成不变的,除了((T)arg0,(V)arg1) => arg0.Method(arg1)
之外,任何适合表示两个lambda表达式等价的方法都可以作为关键。 - Dynami Le Savard