Script之匿名类型与动态类型
1 string s 2 var a new { Nametony, Age20 } 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.EvalIList(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);