对于调试/性能测试,我想在运行时动态地将日志代码添加到给定类型的组件的所有事件处理程序.
例如,对于Datamodule中的所有数据集,我需要在BeforeOpen和AfterOpen事件中运行代码以捕获开始时间,并在AfterOpen中记录已用时间.
我更喜欢动态地执行此操作(没有组件子类化),因此我可以在需要时以最小的努力将其添加到所有现有的数据模块和表单中.
迭代所有组件并按类型过滤很容易,但是对于已经分配了事件处理程序的组件,我需要一种方法来存储现有的事件处理程序,并分配一个新的修改后的事件处理程序,它首先执行日志记录,然后调用原始代码已经存在.
所以这段代码
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
SomeProc;
end;
Run Code Online (Sandbox Code Playgroud)
在运行时会变成
procedure TMyDatamodule.OnBeforeOpen(Sender: TDataset);
begin
StoreStartTime(Sender); // injected code
SomeProc;
end;
Run Code Online (Sandbox Code Playgroud)
是否有可以应用的设计模式,甚至是一些示例代码,说明如何在Delphi中实现它?
是否可以在运行时更改方法体?
class Person
{
public void DoSth()
{ Console.WriteLine("Hello!"); }
}
Run Code Online (Sandbox Code Playgroud)
我想有一个简单的输入字段(如文本框),我可以在运行时编写方法体源代码.
文本框可能包含以下数据:
for (int i = 0; i < 5; i++)
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)
应该在什么时候进行
new Person().DoSth()
Run Code Online (Sandbox Code Playgroud)
叫做.
在C#(使用Reflection)中是否可以(或如何)?
感谢您的帮助.
编辑:
如果上述情况不可能,是否可以在运行时创建一个新方法并调用它?