首页 > 基础资料 博客日记
AScript之匿名类型与动态类型
2026-05-16 11:00:01基础资料围观2次
本篇文章分享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://www.cnblogs.com/rockey627/p/20058232
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:16. LangChain ChatPromptTemplate多模态应用实战
下一篇:没有了

