Natasha 4.0 探索之路系列(四) 模板 API

e2f2fdfd02f1298da25deb08c1440477.png

相关文章

  • Natasha 4.0 探索之路系列(一) 概况

  • Natasha 4.0 探索之路系列(二) 「域」与插件

Natasha 模板

Natasha 在编译单元的基础上进行了封装整理, 并提供了多种模板帮助开发者构建功能.使用此篇的 API 前提是您对 C# 非常熟悉, 对系统的一些类型足够了解.据此 Natasha 将拒绝与科普相关 C# 的 issue , 望谅解.目前已有的模板:

模板名用途
NClass构建类型脚本
NStuct构建结构体脚本
NEnum构建枚举脚本
NInterface构建接口脚本
NRecord构建记录脚本
NDelegate快速创建委托
FastOperator快速创建方法的操作类
FakeOperator方法复制的操作类

使用方法

创建类

//万年不变的预热NatashaInitializer.Preheating();//在随机域内创建一个类型NClass builder = NClass.RandomDomain();var type = builder.Public().Summary("This is a test class;")/*namespace NatashaDynimacSpace{/// <summary>/// This is a test class;/// </summary>public class Nee7e202ee18c413dacae62af6b106c6e*/.PublicReadonlyField<int>("ReadonlyField")//public readonly System.Int32 ReadonlyField;.Ctor(item => item.Public().Body("ReadonlyField = 10;"))/*public Nee7e202ee18c413dacae62af6b106c6e(){ReadonlyField = 10;}*/.PrivateField<string>("_name", "[MyTestAttribute]")//[MyTestAttribute]//private System.String _name;.Property(item => item.Public().Attribute<MyTestAttribute>().Type<string>().Name("NameProperty").OnlyGetter("return _name;"))/*[NatashaFunctionUT.Template.Compile.MyTestAttribute]public System.String NameProperty{get{return _name;}}*/.Property(item => item.Public().Type("AnotherClass").Name("AnotherProperty"))//public AnotherClass AnotherProperty { get; set; }.Method(item => item.Public().Virtrual().Async().Name("SetName").Param<string>("name").Body(@"_name = name;return _name;").Return<Task<string>>())/*public virtual async System.Threading.Tasks.Task<System.String> SetName(System.String name){_name = name;return _name;}*/.NamespaceBodyAppend("public class AnotherClass{}")/*public class AnotherClass{}*/.GetType();

创建结构体

//创建一段如下的结构/*[StructLayout(LayoutKind.Explicit)]public struct EnumUT1{[System.Runtime.InteropServices.FieldOffsetAttribute(0)]public System.Int32 Apple;[System.Runtime.InteropServices.FieldOffsetAttribute(0)]public System.Int32 Orange;}";*/NStruct builder = NStruct.RandomDomain();var type = builder.HiddenNamespace().AttributeAppend("[StructLayout(LayoutKind.Explicit)]").Access(AccessFlags.Public).Name("EnumUT1").Field(item => { item.AttributeAppend<FieldOffsetAttribute>("0").Public().Name("Apple").Type<int>(); }).Field(item => { item.AttributeAppend<FieldOffsetAttribute>("0").Public().Name("Orange").Type<int>(); }).GetType();var script = builder.AssemblyBuilder.SyntaxTrees[0].ToString();

创建枚举

//创建以下枚举/*public enum EnumUT1{/// <summary>/// 苹果/// </summary>Apple = 1,Orange = 2,Banana}*/NEnum builder = NEnum.RandomDomain();var type = builder.NoGlobalUsing().HiddenNamespace().Access(AccessFlags.Public).Name("EnumUT1").EnumField("Apple", 1,"苹果").EnumField("Orange", 2).EnumField("Banana").GetType();var script = builder.AssemblyBuilder.SyntaxTrees[0].ToString();

创建接口

//创建以下接口/*using System;public interface Interface1{System.String Abc { get; set; }System.Int32 Test(System.String p);}*/var builder = NInterface.RandomDomain();var type = builder.NoGlobalUsing().HiddenNamespace().Access(AccessFlags.Public).Name("Interface1").Property(item => item.Type<string>().Name("Abc")).Method(item => item.Name("Test").Param<string>("p").Return<int>()).GetType();var script = builder.AssemblyBuilder.SyntaxTrees[0].ToString();

使用 NDelegate 快速创建委托

NDelegate 实现了自定义委托/系统委托( Action & Func ) 的创建方法.委托的参数名/参数类型/返回值与系统委托一一对应.针对系统委托,如果在添加方法体时还不清楚对应的参数名可以 F12 到对应的 Action/Func 定义中查看参数名.

以下举例了常见的系统委托参数名

  • Action<T1> 定义的参数名为 obj; 而 Action<T1,T2> 参数名为: arg1 , arg2;

  • Func<T1,R> 定义的参数名为 arg; 而 Func<T1,T2,R> 参数名为: arg1 , arg2;

使用代码:

  • 用法1: 自定义委托

public delegate int TestDelegate(string value);var action = NDelegate.RandomDomain().Delegate<TestDelegate>(@"return (value+""hello"").Length;");int result = action("Hello");
  • 用法2: 系统委托

var action = NDelegate.RandomDomain()//创建非托管的异步委托,对应的系统委托: Func<string, string, Task<string>>.UnsafeAsyncFunc<string, string, Task<string>>(@"return arg1 +"" ""+ arg2;");string result = await action("Hello", "World1!");Assert.Equal("Hello World1!", result);

另外,我将在这个目录下上传一些奇奇怪怪的构建,包括一些新科技的应用,和有趣的语义扩展. UT链接

其他 API

模板比起基础构建,除了提供了方便的链式 API ,还有 Using 管理.

  • NoGlobalUsing()/UseGlobalUsing(): 是否使用默认(全局)域 using 覆盖.(默认使用)

  • LoadDomainUsing()/NotLoadDomainUsing(): 是否加载模板所在随机域中的 using.(默认使用)

结尾

实际上 Natasha 模板是针对大部分 C# 的数据类型进行的基础封装, 还可以进一步定制封装,比如以 NClass 为基础创建一个 Web COntroller 模板, 如果需要其他扩展, 可以先了解一下源码结构,或与我讨论进行扩展.

fde44f6deef9821f2fdb04468a48cb28.png

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

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

相关文章

青年博士离职高校被索赔10.5万违约金,后博士上诉至法院,判决来了!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自募格学术我们都知道&#xff0c;现在入职高校往往都要签订一定的服务年限合同&#xff0c;如果合同期未满想要离职的话&#xff0c;需要给高校支付巨额违约金。但根据《劳动法》&#xff0c;有些巨额违约金从法律层面来说是站不住…

linux c 之使用-O来优化gcc

比如一般文件编译 gcc bfs.c -o bfs然后查看花了多少时间 time ./bfs 然后看结果 使用-O 优化&#xff0c;输入下面命令 gcc -O bfs.c -o bfs 再看所需时间&#xff0c;输入下面命令 time ./bfs 结果如图 我们还可以进一步优化用 -O1 -O2 -O3&#xff0c;列如 gcc -O2 bfs.c -…

Hbase Java API详解

2019独角兽企业重金招聘Python工程师标准>>> HBase是Hadoop的数据库&#xff0c;能够对大数据提供随机、实时读写访问。他是开源的&#xff0c;分布式的&#xff0c;多版本的&#xff0c;面向列的&#xff0c;存储模型。 在讲解的时候我首先给大家讲解一下HBase的整…

对C#未来的一点感悟

01—C#有前途吗&#xff1f;在国内C#比较冷门&#xff08;相对Python、Java&#xff09;&#xff0c;很多初学者可能都会对C#的未来有忧虑&#xff0c;害怕没有前途&#xff0c;担心找不到好的工作。其实&#xff0c;大可必须这样&#xff0c;就我在上海而言&#xff0c;我之前…

微软第二财季营收达 517 亿美元,净利润同比增长 21%

微软今日发布了 2022 财年第二财季财报&#xff0c;营收为 517.28 亿美元&#xff0c;与去年同期的 430.76 亿美元相比增长 20%。净利润为 187.65 亿美元&#xff0c;与去年同期的 154.63 亿美元相比增长 21%。生产力和业务流程部门的营收为 159.36 亿美元&#xff0c;与去年同…

二值图像--形态学处理3 开操作和闭操作

学习DIP第13天 转载请标明出处&#xff1a;http://blog.csdn.net/tonyshengtan&#xff0c;欢迎大家转载&#xff0c;发现博客被某些论坛转载后&#xff0c;图像无法正常显示&#xff0c;无法正常表达本人观点&#xff0c;对此表示很不满意。。。。。。。。 开篇废话 简单来说所…

Linux查看硬件信息很Easy

往往一到公司盘点或升级服务器硬件时候&#xff0c;需要记录服务器的具体硬件信息&#xff0c;对于Windows下来说&#xff0c;装个鲁大师既可以查看所有硬件信息&#xff0c;但Linux下要想查看这些硬件信息要麻烦的多&#xff0c;下面是我整理的一些命令&#xff0c;再查看Linu…

常见正则表达式

2019独角兽企业重金招聘Python工程师标准>>> ip地址 /^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(…

WPF 实现动态Windows桌面壁纸~

由于微信群人数太多入群请添加小编微信号yanjinhuawechat 或 W_Feng_aiQ 邀请入群需备注WPF开发者 PS&#xff1a;有更好的方式欢迎推荐。此项目灵感来源于 丑萌气质狗 B站同名 QQ群&#xff1a;560611514 &#xff08;学习Unity3D&#xff09;增加了播放视频。01—代码如下一…

linux c用open打开(创建)一个文件

1、文件描述符 Linux操作系统内核(kernel)利用文件描述符来访问文件,文件描述符大于等于0,是一个用户描述被打开文件的索引值,它指向该文件的相关信息记录表,当文件打开或者创建新文件的时,就会返回一个文件描述符,当读写文件时,也需要使用文件描述符来指定特写文件。…

Natasha 4.0 探索之路系列(三) 基本的动态编译

相关文章Natasha 4.0 探索之路系列(一) 概况Natasha 4.0 探索之路系列(二) 「域」与插件Natasha 的设计动态编译Roslyn 为开发者提供了动态编译的接口&#xff0c;允许我们以 C# 代码来编写 Emit 或 表达式树生成的程序集&#xff0c;但是完成一个编译需要诸多步骤&#xff0c;…

〖Windows〗Linux的Qt程序源码转换至Windows平台运行,编码的解决

在中国大陆&#xff0c;Windows默认的编码是gb2312&#xff0c;而Linux是UTF8&#xff1b; 多数情况下&#xff0c;把Linux上的程序转换至Windows上运行需要进行编码转换才能正常显示&#xff1b; 而其实大可以不必的&#xff0c;同样&#xff0c;文件使用的依然是UTF-8&#x…

使用WebSocket绕过广告屏蔽插件

2019独角兽企业重金招聘Python工程师标准>>> 现在网络上的广告真的是无所不用其极&#xff0c;在网上冲浪&#xff0c;稍不留神&#xff0c;随时随地都会碰上广告&#xff0c;于是广告屏蔽这个需求&#xff0c;就应运而生了。古语云&#xff0c;道高一尺魔高一丈。今…

linux c头文件#include<sys/types.h>和#include<fcntl.h>头文件总结

#include<sys/types.h>的介绍 是Unix/Linux系统的基本系统数据类型的头文件&#xff0c;含有size_t&#xff0c;time_t&#xff0c;pid_t等类型。linux编程中经常用到的头文件。 clock_t 表示系统时间&#xff08;以时钟周期为单位&#xff09;。   dev_t 用于设备号…

vba怎么安装_学VBA,这些最基础的概念一定要知道

说说VBA的那些事儿VBA是什么&#xff1f;很多使用Excel的人经常会看到这三个字母&#xff0c;那么VBA到底是什么呢&#xff1f;长得神似VB的它到底是干什么的&#xff1f;相信很多人都会有这样的问题&#xff0c;今天就和大家说说有关VBA的那些事儿。1 VBA到底是什么VBA的全称&…