【发布时间】:2011-01-07 10:44:58
【问题描述】:
我有一部分代码在运行时接受 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)
【问题讨论】:
-
密钥是否始终采用以下格式:(type)arg => arg.Method() 或更复杂的格式?
-
嗯,收到的 lambda 可能有更多的参数,比如
(f,g) => f.Method(g),我会有 f 和 g 的类型。关键实际上很普通,并不是一成不变的,任何合适的方式来表示((T)arg0,(V)arg1) => arg0.Method(arg1)旁边的 2 个 lambda 之间的等价性都可以作为关键。
标签: c# delegates lambda expression