Natasha v2.5.4 版与运行时实战

文章转载授权级别:B

Natasha 是一个十分便捷的动态构建库,支持.NET Standard2.0 / Core3.0+ ; 比起繁杂的 IL 指令和 Expression 的众多 API ,  Natasha 的构建方式更加友好简洁, 基于 Natasha 可以让动态工作变得傻瓜,简单,让开发者更加专注动态代码的逻辑。 在上一篇动态查找树的文章中,我们使用算法结合 Natasha 将字典的性能提升了一倍且支持并发,在性能优化上面取得了比较显著的成效。

下面将写一些入门的操作,希望更多的开发者能参与进来,一起提升和体验 Natasha (项目地址:https://github.com/dotnetcore/Natasha);

场景1:在程序运行时,通过外面传来的字符串,创建一个委托,并且可以回收。

string input = @"return arg1+arg2;";
//先创建域再创建委托var func = NDomain            .Create("MyDomain")   //域名为MyDomain的独立域 .Func<string, string, string>(input);var result = func("Hello"," World!");//result: Hello World!
//卸载独立域 - 回收func.Delete();

场景2:在程序运行时,通过字符串创建一个类/结构体/枚举/接口。

//在名为 MyDomain 的独立域内创建一个类型var type = NDomain.Create("MyDomain").GetType(                @"public class/struct/enum/interface  DomainTest1{                        public string Name;                        public DomainOperator Operator;                }");                //卸载独立域 - 回收              type.Delete();

场景3:测试一个复杂的应用场景。

步骤:

    1、在系统域内创建一个类A,包括一个静态方法 B。

    2、在 B 方法中实现 try/catch。

    3、在 B 方法中调用 SqlConnection/Json.net 等依赖库操作。

    4、在 B 方法中调用当前不同命名空间的类。

    5、返回一个结果。

    6、在独立域创建一个静态类及方法,并返回刚才创建的系统域的 A.B 方法。


 var type = NClass.Create()  //Create参数为空时,使用系统域  .Public .Namespace("OperatorOverride")             .OopName("Test1")   //类名为Test1 .OopBody(@" public static string GetTest(){ try { System.Data.SqlClient.SqlConnection client = new System.Data.SqlClient.SqlConnection(); client.Open(); SqlCommand cmd = client.CreateCommand(); SqlDataReader read = cmd.ExecuteReader();                return ""succeed!""; } catch (Exception ex) { Test2 test = new Test2(); test.Error = new Model2.Test3(); test.Error.Name = ex.Message;                 return JsonConvert.SerializeObject(test);
            }}")            .GetType();
//在随机域中返回刚刚创建的方法var func = NDomain.Random()           .Func<Func<string>>("return Test1.GetTest;")
var GetTest = func();Console.WriteLine(GetTest());
//结果:{"Error":{"Name":"The ConnectionString property has not been initialized."}}

场景4:针对 TryHandler类 构建一个可以自定义的处理流程,我们项目的需求变更十分频繁,在需求稳定之前我们不得不进行大量的调试和试错,希望有这么一个系统能再不重启的情况下支持我们折腾。

控制约束类:

public static class TryHandler<T>{
  //获取产品  public static Func<T, Product> GetProductEntity;  //写入数据库  public static Func<Product, bool> WriteProduct;  //日志放到队列里  public static Func<bool, Product, bool> SendLogToQueue;  //这里是入口  public static Func<T, bool> Hanlder;
}

脚本扩展类:

public static class ScriptHandler{  //使用Natasha将字符串转换为可执行代码  public static void Handler(string str)  {      var action = NDomain.Random().Action(str);      action();  }
}

准备好写在外面需要传入的脚本,这里用 txt 文件代替,如图:

如果看不清图:主要的输出是将产品序列化到 1.txt 中,并在屏幕上打印 成功或者失败。

在入口函数:

foreach (var item in files){    //读脚本并让其生效    ScriptHandler.Handler(File.ReadAllText(item));}
Apple apple = new Apple();apple.AppleId = 10;apple.AppleName = "苹果";
TryHandler<Apple>.Hanlder(apple);

执行结果:

{"Id":10,"Name":"苹果"}

最新版 Natasha 有了什么变化:

Natasha 所有 API 将以域为首要条件,如果使用 FastMethod / FakeMethod / Oop 等 Operator 时将默认提供三种静态实例方法:Create / Random 方便用户创建域 / 使用系统域 / 使用随机域等。

Natahsha 最新版支持命名空间引用的覆盖,增加了 CS0104 / CS0234 / CS0246 等问题处理方案,在出现二义性引用时优先使用开发者传入 Using 的命名空间,针对命名空间无效的情况,Natasha 将在第一次编译时进行过滤移除并进行第二次编译,命名空间的处理对开发者尽可能透明。


https://github.com/dotnetcore

打赏一杯酒,削减三分愁。
跟着我们走,脱发包你有。

组织打赏账户为柠檬的账户,请标注「NCC」,并留下您的名字,以下地址可查看收支明细:https://github.com/dotnetcore/Home/blob/master/Statement-of-Income-and-Expense.md

OpenNCC,专注.NET技术的公众号

https://www.dotnetcore.xyz

微信ID:OpenNCC

长按左侧二维码关注

欢迎打赏组织

给予我们更多的支持

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构 堆中的路径(最小堆)

题目&#xff1a; 将一系列给定数字插入一个初始为空的小顶堆H[ ]。随后对任意给定的下标i&#xff0c;打印从H[i]到根结点的路径。 输入格式: 每组测试第1行包含2个正整数N和M(≤1000)&#xff0c;分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 100…

.Net Core3.1下使用Swagger搭建web api项目

前言&#xff1a;微软于前天发布.net core 3.1正式版,并将长期支持3.1。所以我听到这个消息后就急忙下载.net core 3.1的SDK和Runtime,应该是公司最先用3.1的攻城狮了????。OK&#xff01;废话少说&#xff0c;今天的目的是基于.net core 3.1建一个web api的项目先下载.net…

一个值得学习的WPF开源项目

项目介绍此项目应用了Prism MVVM框架&#xff0c;项目展示数据来源于其他服务程序&#xff0c;使用的WebAPI通信&#xff0c;如果要正常运行此程序&#xff0c;需要您自己做一个WebAPI程序&#xff0c;由API接口提供数据驱动&#xff0c;其实直接查看代码最直接&#xff0c;有需…

程序员修神之路--打通Docker镜像发布容器运行流程

菜菜哥&#xff0c;我看了一下docker相关的内容&#xff0c;但是还是有点迷糊还有哪不明白呢&#xff1f;如果我想用docker实现所谓的云原生&#xff0c;我的项目该怎么发布呢&#xff1f;这还是要详细介绍一下docker了Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言…

PTA 三足鼎立 (lower_bound()+upper_bound())

当三个国家中的任何两国实力之和都大于第三国的时候&#xff0c;这三个国家互相结盟就呈“三足鼎立”之势&#xff0c;这种状态是最稳定的。 现已知本国的实力值&#xff0c;又给出 n 个其他国家的实力值。我们需要从这 n 个国家中找 2 个结盟&#xff0c;以成三足鼎立。有多少…

用.NET解索尼相机ARW格式照片

用.NET解索尼相机ARW格式照片目前常用的照片格式是 .jpg&#xff0c;它只能提供 8bit的色彩深度&#xff0c;而目前主流的相机都能提供高达 12bit- 14bit的色彩深度&#xff0c;动态范围和后期处理能力也大大增加&#xff0c;这也是为什么不少摄影爱好者会优先使用相机提供原始…

天梯赛 喊山 bfs

喊山&#xff0c;是人双手围在嘴边成喇叭状&#xff0c;对着远方高山发出“喂—喂喂—喂喂喂……”的呼唤。呼唤声通过空气的传递&#xff0c;回荡于深谷之间&#xff0c;传送到人们耳中&#xff0c;发出约定俗成的“讯号”&#xff0c;达到声讯传递交流的目的。原来它是彝族先…

ASP.NET Core on K8S深入学习(10)K8S包管理器Helm-Part 1

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。关于HelmWhy Helm&#xff1f;虽然K8S能够很好地组织和编排容器&#xff0c;但是缺少一个更高层次的应用打包工具&#xff0c;而Helm就是专门干这个事的。通过Helm能够…

520 钻石争霸赛 7-8浪漫侧影(二叉树的遍历)

“侧影”就是从左侧或者右侧去观察物体所看到的内容。例如上图中男生的侧影是从他右侧看过去的样子&#xff0c;叫“右视图”&#xff1b;女生的侧影是从她左侧看过去的样子&#xff0c;叫“左视图”。 520 这个日子还在打比赛的你&#xff0c;也就抱着一棵二叉树左看看右看看…

依赖注入在 dotnet core 中实现与使用:2 使用 Extensions DependencyInjection

既然是依赖注入容器&#xff0c;必然会涉及到服务的注册&#xff0c;获取服务实例&#xff0c;管理作用域&#xff0c;服务注入这四个方面。服务注册涉及如何将我们的定义的服务注册到容器中。这通常是实际开发中使用容器的第一步&#xff0c;而容器本身通常是由框架来实例化的…

520 钻石争霸赛 7-6 矩阵列平移(循环)

给定一个 nn 的整数矩阵。对任一给定的正整数 k<n&#xff0c;我们将矩阵的偶数列的元素整体向下依次平移 1、……、k、1、……、k、…… 个位置&#xff0c;平移空出的位置用整数 x 补。你需要计算出结果矩阵的每一行元素的和。 输入格式&#xff1a; 输入第一行给出 3 个…

拿 C# 搞函数式编程 - 2

前一阵子在写 CPU&#xff0c;导致一直没有什么时间去做其他的事情&#xff0c;现在好不容易做完闲下来了&#xff0c;我又可以水文章了哈哈哈哈哈。有关 FP 的类型部分我打算放到明年再讲&#xff0c;因为现有的 C# 虽然有一个 pattern matching expressions&#xff0c;但是没…

520 钻石争霸赛 7-5 大勾股定理 (数学)

基本思路&#xff1a; 这道题暴力拿到14分并不难&#xff0c;根据题意模拟即可&#xff0c;具体代码在下面。 至于最后一个测试点超时的问题&#xff0c;现已解决&#xff0c;AC代码在第二部分哦~ 参考代码&#xff08;14分&#xff09;&#xff1a; #include<bits/stdc.h…

.NETer,如何用.NET Core 3.0武装自己?这样学效率提高10倍!

都2020了 你还不会.NET Core&#xff1f; 2019年&#xff0c;.NET Core 3.0横空出世&#xff0c;越来越多的开发者开始关注.NET Core&#xff0c;越来越多的互联网软件公司开始使用.NET Core&#xff0c;各大.NET招聘岗位要求中&#xff0c;也将.NET Core列为必备技能&#xff…

DataFrame的多dtype创建方法

在创建DataFrame的时候&#xff0c;只有有一个dtype类型。 若使用numpy数组的字典&#xff0c;就可以分别设置dtype类型了。 import numpy as np import pandas as pddata {Site:np.array([Google, Runoob, Wiki],dtypestr),Age:np.array([10, 12, 13], dtypefloat),Year:np.…

ASP.NET Core on K8S深入学习(10)K8S包管理器Helm-Part 2

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff0c;可以点击查看更多容器化技术相关系列文章。上一篇 Part 1 中介绍了Helm的基本概念与基本使用&#xff0c;这一篇我们来自定义一个Chart玩玩。自定义一个Chart1 创建Chart首先&#xff0c;通过以下命令创建一个c…

使用Vistual Studio N年,推荐2个异常捕获的技巧

点击上方“dotNET全栈开发”&#xff0c;“设为星标”加“星标★”&#xff0c;每天11.50&#xff0c;好文必达全文约1600字&#xff0c;预计阅读时间3分钟这个n到底是多少年&#xff1f;宇宙第一开发IDE Visual Studio的调试功能非常强大&#xff0c;平常工作debug帮助我们解决…

LeetCode动态规划 斐波那契数

斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n > 1 给你 n &a…

Magicodes.Sms短信库的封装和集成

简介Magicodes.Sms是心莱团队封装的短信服务库&#xff0c;已提供Abp模块的封装。Nuget新的包开始使用如果使用Abp相关模块&#xff0c;则使用起来比较简单&#xff0c;具体您可以参考相关单元测试的编写。主要有以下步骤&#xff1a;1.引用对应的Nuget包如&#xff1a;2.添加模…

LeetCode动态规划 使用最小花费爬楼梯

数组的每个下标作为一个阶梯&#xff0c;第 i 个阶梯对应着一个非负数的体力花费值 cost[i]&#xff08;下标从 0 开始&#xff09;。 每当你爬上一个阶梯你都要花费对应的体力值&#xff0c;一旦支付了相应的体力值&#xff0c;你就可以选择向上爬一个阶梯或者爬两个阶梯。 请…