• 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(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

  • 相关阅读:
    域名信息收集
    oracle数据库操作—DML
    团建游戏----红与黑
    zemax对称式目镜
    用R语言实现神经网络预测股票实例
    【LoRaWAN节点应用】安信可Ra-08/Ra-08H模组入网LoRaWAN网络的应用及功耗情况
    Springboot+学生作业管理系统 毕业设计-附源码251208
    vue实现tagsview多页签导航功能
    Android studio2022.3项目中,底部导航菜单数多于3个时,只有当前菜单显示文本,其他非选中菜单不显示文本
    1025 反转链表
  • 原文地址:https://www.cnblogs.com/rockey627/p/20058232