Natasha 4.0 探索之路系列(四) 模板 API
相关文章
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 模板, 如果需要其他扩展, 可以先了解一下源码结构,或与我讨论进行扩展.
Natasha 4.0 探索之路系列(四) 模板 API相关推荐
- Natasha 4.0 探索之路系列(三) 基本的动态编译
相关文章 Natasha 4.0 探索之路系列(一) 概况 Natasha 4.0 探索之路系列(二) 「域」与插件 Natasha 的设计 动态编译 Roslyn 为开发者提供了动态编译的接口,允许 ...
- Natasha 4.0 探索之路系列(一) 概况
简介 Natasha 是一个基于 Roslyn 的动态编译类库,它以极简的 API 完成了动态编译的大部分功能,使用它可以在程序运行时编译出新的程序集. Natasha 允许开发人员直接使用 C# 代 ...
- Natasha 4.0 探索之路系列(二) 「域」与插件
域与ALC 在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题,能不能兼容 AppDomain.如何使用 AppDomain.为什么 CoreAPI 阉割了 AppDomain 等一系列的问 ...
- Launcher启动的流程图【AndroidICS4.0——Launcher系列四】
先画一个Launche启动的流程图,虽然不是特别规范,但是勉强能看看,我也整理下Launcher的一系列的流程图,最近修改Launcher,又对Launcher加深了一些了解, 转载请标明出处:htt ...
- ActionScript 3.0 Step By Step系列(四):来自面向对象开发之前的呐喊:“学会写可重用的代码”...
增强代码的可重用能力,从创建可重用的代码开始,可重用的代码则是通过从现有代码中重构加以封装,使其成为功能单一的可复用代码块.这句话笼统点说便是"封装"或"抽象" ...
- 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...
- 【Java 虚拟机探索之路系列】:JIT编译器
[Java 虚拟机探索之路系列]:JIT编译器 作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https: ...
- SQL Server 2008空间数据应用系列四:基础空间对象与函数应用
SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1. ...
- ONNX系列四 --- 使用ONNX使TensorFlow模型可移植
目录 TensorFlow简介 安装和导入转换器 快速浏览模型 将TensorFlow模型转换为ONNX 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- ...
最新文章
- Unix的轻巧“约取而实得”(上篇)
- python装keras_python – 在anaconda中安装keras时出错. / p KER...
- AMD芯片支持oracle数据库,oracle 11gR2 amdu 工具可以直接使用
- Django 之Form
- Leetcode 208. 实现 Trie (前缀树) 解题思路及C++实现
- 如何免费注册Coursera课程
- MySQL基础操作(一)
- docker 笔记(2) -- 镜像
- android将彩图转为黑白_Android逆向反编译代码注入APK过程思路分析
- Kaldi(A1)语音识别原理
- AJAX培训第二讲:使用AJAX框架(下)
- 清理windows10系统垃圾文件-bat批处理命令
- 【EI稳定检索】第二届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2022)
- JAVA跑步计时器app_坚持跑步神器app
- PMP笔记 第6章 项目进度管理
- 知道君推荐给大家一些写论文、搞科研、读大学必备的30款软件。
- 720度全景 html5代码,720web全景demo
- 网络编程六-网络编程相关面试题汇总
- Rhinoceros mac版(犀牛三维建模软件)中文版
- iOS 加密算法之MD5加密使用
热门文章
- 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点
- saltstack 安装nginx
- Open Flash Chart 初体验
- 2009年最佳80后科技创业者
- mysql内连接的自连接_mysql 内连接、外连接、自连接
- Eclipse控制项目的访问名称
- Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
- stm32串口通讯问题
- ActiveMQ无法启动
- Hibernate学习——建立一个简单的Hibernate项目