惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
U
Unit 42
GbyAI
GbyAI
M
MIT News - Artificial intelligence
美团技术团队
罗磊的独立博客
雷峰网
雷峰网
量子位
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
D
Docker
小众软件
小众软件
S
SegmentFault 最新的问题
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
宝玉的分享
宝玉的分享
T
Tailwind CSS Blog
WordPress大学
WordPress大学
V
V2EX
博客园_首页
腾讯CDC
The Cloudflare Blog
A
About on SuperTechFans
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园_首页

Linux实操--组管理、权限管理和定时任务 Java + EasyExcel 实现单个接口导出多个Excel Mem0 源码解析系列(二):提示词工程的深度剖析 Openclaw TaskFlow究竟是什么?和普通Skill技能有什么区别 博文阅读密码验证 - 博客园 嘉立创开源:应该是全网MicroPython教程最多的开发板 Hermes Agent 集成实践:从协议到生产 2026年AI编程工具横评:Cursor、Codex、Claude Code、Zed、Windsurf Java程序员必看的RAG入门教程 2026 AI效率神器:Superpowers + Claude Code 保姆级教程 本地大模型部署全攻略:从 0 到 1 玩转 Ollama 【从0到1构建一个ClaudeAgent】内存管理-上下文压缩 .NET 高级开发 | 设计、实现一个事件总线框架 电子小白入门之NE555 3. WorkBuddy:隐藏玩法,一键召唤专家,让 AI 以"专家身份"给你干活 和AI一起搞事情#3:Claude Teammate 游戏开发翻车实录 【OpenClaw】通过 Nanobot 源码学习架构---(7)Memory C# .NET 周刊|2026年3月3期 我在 Debian 11 上把 K8s 单机搭起来了,过程没你想的那么顺(/opt 目录版) 深度学习进阶(七)Data-efficient Image Transformer CLI+Skill搭建浏览器AI自动化框架,告别一切重复枯燥任务 告别Token账单无底洞:OpenClaw本地部署,重塑企业数据主权的唯一解 FastAPI+Vue:文件分片上传+秒传+断点续传,这坑我帮你踩平了! SBTI 爆火后,我做了个程序员版的 CBTI。。已开源 + 附开发过程 多模态检索开始进入工程期:用 Sentence Transformers 搭建可落地的 Multimodal RAG 100多行代码实现一个最简单的Agent(用ReAct) Claude Code 通关手册(八):推荐 5 个 Hooks,代码质量提升 3 倍 老板:“有人截图了!”。安全部门:“收到,马上查暗水印!” - why技术 技术之外,皆是人间 C#/.NET/.NET Core技术前沿周刊 | 第 69 期(2026年4.01-4.12)
AScript之匿名类型与动态类型
rockey627 · 2026-05-16 · via 博客园_首页

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