它可能甚至不可能这样做,但无论如何我会问.是否可以创建一个接收字符串的函数,然后将其用作lambda中使用的转到运算符(=>)的右侧参数?
实际上,我想要做的是能够在运行时重新定义特定类的特定方法.我希望在程序运行时写下一个函数并将其附加到委托.可能吗?
你有几种方法可以做到这一点:
动态创建lambda表达式(查看动态LINQ:第1部分)
动态创建CodeDom模型并在运行时编译它(查看CodeDom.Compiler命名空间
动态创建C#/ VB.NET源代码并在运行时编译它(查看CSharpCodeProvider和VBCodeProvider类)
动态创建对象模型,可以执行与方法相同的操作(查看策略设计模式
最简单的方法可能就是TcKs建议的DLINQ.
最快的(我相信,在3.5中)是创建一个DynamicMethod.它也是最可怕的方法.你实际上是使用IL构建一个方法,它与在机器语言中编写代码的感觉大致相同.
我需要这样做才能动态地将事件处理程序附加到某些东西上(好吧,我不需要这样做,我只是想让单元测试事件更容易).当时看起来有点令人生畏,因为我不知道有关IL的废话,但我想出了一个简单的方法来实现这一目标.
你所做的是创建一个完全符合你想要的方法.越紧凑越好.如果我能弄清楚你想要做什么,我会提供一个例子.您在DLL项目中的类中编写此方法,并在发布模式下编译它.然后在Reflector中打开DLL并反汇编您的方法.Reflector为您提供了您希望反汇编的语言选项 - 选择IL.现在,您需要添加到动态方法中的确切调用.只需按照MSDN上的示例,为您反映的方法代码切换示例的IL.
动态方法一旦构造,就会以与编译方法大致相同的速度调用(看到一个测试,其中动态方法可以在~20ms内调用,其中反射超过200ms).
您的问题很不清楚,但您当然可以使用表达式树在执行时动态创建委托.(还有其他方法可以做到这一点,比如CodeDOM,但是表达树如果能够完成所有你需要的话就更方便了.但是,你可以做的事情有很大的限制.)
但是,使用带有一些捕获变量的lambda表达式通常更容易.
例如,要创建一个将指定数量添加到任何整数的函数,您可以编写:
static FuncCreateAdder(int amountToAdd) { return x => x + amountToAdd; } ... var adder = CreateAdder(10); Console.WriteLine(adder(5)); // Prints 15
如果这没有帮助,请澄清您的问题.