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
