当前位置: 首页 > news >正文

Script之匿名类型与动态类型

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);

http://www.jsqmd.com/news/1078747/

相关文章:

  • VSCode C/C++ 工程头文件跳转(IntelliSense)配置通用指南
  • 第6课:深度学习与神经网络入门
  • 哈迪斯2|官方中文|Build.23661331-战歌四起-冥界神威+全DLC+修改器
  • 汇编——数据宽度
  • 闲鱼反爬虫实战:逆向JS加密与行为风控对抗策略
  • 如何一站式解决Windows程序DLL缺失问题?VisualCppRedist AIO自动化工具全解析
  • 酶工程核心技术解析:从定向进化到理性设计的生物催化剂改造
  • 进程内套接字流转与无网路由仿真:基于 Flask 请求生命周期与 Requests 内存拦截的 Pytest 全链路微服务网络治理
  • 抖音直播数据抓取终极指南:5分钟搭建实时弹幕分析系统
  • Elasticsearch DiskBBQ 在网络附加存储上的向量搜索性能比 Qdrant 快 7 倍
  • 从愤怒的小鸟到罗维奥:IP驱动型游戏公司的战略转型与运营实践
  • BusMaster报文发送实战:从硬件配置到自动化测试全解析
  • Abode AN安装包
  • 零代码构建数据驾驶舱:基于助睿平台的数据大屏制作全流程指南
  • MacBook Air M2本地部署DeepSeek-Coder实战指南
  • TelegramGroup:两万多个 Star 的电报资源导航
  • NSK大跨距极速精密滚珠丝杠技术解析
  • 2026腾讯会议领衔5款纪要工具选型指南与推荐
  • 它解决的不是“写代码”,而是“盯流程”
  • 2026年触摸开关控制器口碑供应商推荐清单
  • 企业级智能体哪家做得好? 2026落地选型深度评测与架构实战
  • 人工智能专业术语详解(V)
  • 用了一个 AI 聚合平台后,我终于明白多模型入口的价值
  • 3分钟终极指南:Windows一键安装苹果USB网络共享驱动
  • 突破窗口限制:用Window Resizer打造完美工作空间
  • 理查米尔中国官网价格的溢价骗局:拆开萧邦Happy Sport活动钻石,这处夹层让人瞬间清醒
  • AI 赋能测试全流程(贯穿全生命周期)
  • 阿里一面:你的 RAG 召回一堆垃圾,就这么硬塞给大模型?它不会自己再查一遍
  • GPT-4稀疏激活原理:MoE架构下2%参数如何驱动高效推理
  • 2026企业级AI Agent全景图发布:行业迈入规模化落地拐点