AScript之匿名类型与动态类型

AScript是一个开源的C#动态脚本解析执行引擎,其中有两种数据类型比较特殊:匿名类型动态类型

一、匿名类型

匿名类型是在编译时确定结构,适合固定数据结构,属性只读。

复制代码
 1 string s = @"
 2 var a = new { Name='tony', Age=20 }
 3 a.Name + ':' + a.Age
 4 ";
 5 var script = new Script();
 6 Assert.AreEqual("tony:20", script.Eval(s));
 7 dynamic a = script.Eval("a");
 8 // 获取脚本中定义的匿名类型
 9 var type = Script.AnonymousTypes.CreateType(new[] { "Name", "Age" }, new[] { typeof(string), typeof(int) });
10 Assert.IsInstanceOfType(a, type);
11 Assert.AreEqual("tony", a.Name);
12 Assert.AreEqual(20, a.Age);
13 Assert.AreEqual("{ Name = tony, Age = 20 }", a.ToString());

可以从 Script.AnonymousTypes 中获取脚本内定义的匿名类型。

匿名类型也常用于LINQ查询:

复制代码
 1 string s = @"
 2 var q = from a in context.Persons
 3     join b in context.AddressInfos on a.Id equals b.UserId into bb
 4     from b in bb.DefaultIfEmpty()
 5     select new { a.Id, a.Name, a.Age, MyAddress = b.Address };
 6 q.ToList();
 7 ";
 8 var script = new Script();
 9 // 数据库DbContext变量
10 script.Context.SetVar("context", context);
11 var list = script.Eval<IList>(s);
12 Console.WriteLine(JsonConvert.SerializeObject(list, Formatting.Indented));

匿名类型实现详见源码: AnonymousTypeManager

二、动态类型

动态类型 ExpandoObject ,运行时可动态添加属性,对应js中的写法: var a = { } 。

复制代码
 1 string s = @"
 2 var a = new ExpandoObject();
 3 a.Name = 'jim';
 4 a.Age = 23;
 5 a
 6 ";
 7 var script = new Script();
 8 dynamic a = script.Eval(s);
 9 Assert.IsInstanceOfType(a, typeof(ExpandoObject));
10 Assert.AreEqual("jim", a.Name);
11 Assert.AreEqual(23, a.Age);

使用初始化器创建动态类型:

复制代码
 1 string s = @"
 2 var a = new ExpandoObject { Name = 'jim', Age = 23 };
 3 a.Height= 170;
 4 a
 5 ";
 6 var script = new Script();
 7 dynamic a = script.Eval(s);
 8 Assert.IsInstanceOfType(a, typeof(ExpandoObject));
 9 Assert.AreEqual("jim", a.Name);
10 Assert.AreEqual(23, a.Age);
11 Assert.AreEqual(170, a.Height);

AScript 的匿名类型和动态类型为脚本提供了灵活的数据结构表达能力。

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

相关推荐
Lost of 程序猿34 分钟前
用 YARP 为 .NET 微服务搭一座“立交桥“:路由转发与生产配置实践
c#·asp.net
点纭4 小时前
C 语言 第七章 常用函数(3)
c语言·开发语言·算法·oracle·c#
用户788477316344 小时前
用 .NET MAUI 一套 C# 同时出 Windows 和 Android:哪些是真能共享,哪些是 marketing
c#
qq_410194295 小时前
.NET 8.0 下基于 PaddleOCRSharp 的离线文字识别落地指南
算法·.net
Lost of 程序猿6 小时前
用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录
后端·c#·asp.net
liulilittle6 小时前
麻将节点间路由转发链:失败回退与错误传播语义(ROUTE_SEMANTICS)
ai·自动化·llm·mock·测试·script·tools
林川~0116 小时前
Unity 万能物理检测工具:射线检测 / 范围检测 / 层级过滤 / 编辑器可视化(可直接拿去用)
游戏·unity·c#·射线检测·通用工具
He BianGu20 小时前
【WPF-VisionMaster】机器视觉通用平台V5.0版本发行说明
opencv·c#·wpf·halcon·机器视觉·visionmaster
tang_042720 小时前
【Hi.Ltd 专题】第9期:Interop 配置互操作(JSON/INI/XML/YAML/注册表/扫码)
经验分享·c#·hi.ltd系列
tang_04271 天前
【Hi.Ltd 专题】第7期:Threading 采集线程、锁与 LRU 缓存
经验分享·c#·hi.ltd系列