AScript之事件处理脚本

AScript是一个开源的C#动态脚本解析执行引擎,脚本中支持定义事件处理。

一、Lambda委托

复制代码
 1 var s = @"
 2 var p = new Person('tom', 20);
 3 p.Saying += (ss,ee)=>{
 4     (ss as Person).Age+=1;
 5 }
 6 p.SayHello();
 7 ";
 8 var script = new Script();
 9 script.Context.AddType<Person>();
10 Assert.AreEqual("Hello, my name is tom, I'm 21 years old", script.Eval(s));

直接添加Lambda委托事件,该方式无法移除事件处理。

二、方法委托

复制代码
 1 var s = @"
 2 void saying(object sender, EventArgs e) {
 3     (sender as Person).Age+=1;
 4 }
 5 var p = new Person('tom', 20);
 6 p.Saying += saying;
 7 p.SayHello();
 8 // 可以在脚本中移除事件处理
 9 // p.Saying -= saying;
10 ";
11 var script = new Script();
12 script.Context.AddType<Person>();
13 Assert.AreEqual("Hello, my name is tom, I'm 21 years old", script.Eval(s));
14 // 外部调用触发事件
15 var p = script.Eval<Person>("p");
16 Assert.AreEqual("Hello, my name is tom, I'm 22 years old", p.SayHello());
17 // 外部移除事件处理
18 var handle = script.Context.GetEvent<EventHandler<EventArgs>>("saying");
19 p.Saying -= handle;
20 Assert.AreEqual("Hello, my name is tom, I'm 22 years old", p.SayHello());

添加方法委托事件处理,该方式可以在脚本中移除事件处理,也可以外部移除,灵活控制。

结束语

通过引入事件处理,为动态脚本增加了强大的扩展能力,比如在窗体应用动态脚本中添加控件事件处理,为程序实现更多的动态扩展能力。

AScript开源地址:https://gitee.com/rockey627/AScript

相关推荐
唐青枫21 小时前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net
唐青枫2 天前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
Caco_D2 天前
一行代码抓遍全网 20 个热榜!Aneiang.Pa 4.0 发布 — 极简 .NET 爬虫库
爬虫·.net
咕白m6252 天前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户91721561902112 天前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠3 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
唐青枫5 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech5 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf7 天前
C#摸鱼实录——IoC与DI案例详解
c#