相关文章

  • 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相关推荐

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

    相关文章 Natasha 4.0 探索之路系列(一) 概况 Natasha 4.0 探索之路系列(二) 「域」与插件 Natasha 的设计 动态编译 Roslyn 为开发者提供了动态编译的接口,允许 ...

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

    简介 Natasha 是一个基于 Roslyn 的动态编译类库,它以极简的 API 完成了动态编译的大部分功能,使用它可以在程序运行时编译出新的程序集. Natasha 允许开发人员直接使用 C# 代 ...

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

    域与ALC 在 Natasha 发布之后有不少小伙伴跑过来问域相关的问题,能不能兼容 AppDomain.如何使用 AppDomain.为什么 CoreAPI 阉割了 AppDomain 等一系列的问 ...

  4. Launcher启动的流程图【AndroidICS4.0——Launcher系列四】

    先画一个Launche启动的流程图,虽然不是特别规范,但是勉强能看看,我也整理下Launcher的一系列的流程图,最近修改Launcher,又对Launcher加深了一些了解, 转载请标明出处:htt ...

  5. ActionScript 3.0 Step By Step系列(四):来自面向对象开发之前的呐喊:“学会写可重用的代码”...

    增强代码的可重用能力,从创建可重用的代码开始,可重用的代码则是通过从现有代码中重构加以封装,使其成为功能单一的可复用代码块.这句话笼统点说便是"封装"或"抽象" ...

  6. 【Visual C++】游戏开发笔记四十六 浅墨DirectX教程十四 模板测试与镜面特效专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处.   文章链接: http://blog.csdn.net/zhmxy555/article/details/8632184 作者:毛星云( ...

  7. 【Java 虚拟机探索之路系列】:JIT编译器

    [Java 虚拟机探索之路系列]:JIT编译器 作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https: ...

  8. SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

    SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1. ...

  9. ONNX系列四 --- 使用ONNX使TensorFlow模型可移植

    目录 TensorFlow简介 安装和导入转换器 快速浏览模型 将TensorFlow模型转换为ONNX 摘要和后续步骤 参考文献 下载源547.1 KB 系列文章列表如下: ONNX系列一 --- ...

最新文章

  1. Unix的轻巧“约取而实得”(上篇)
  2. python装keras_python – 在anaconda中安装keras时出错. / p KER...
  3. AMD芯片支持oracle数据库,oracle 11gR2 amdu 工具可以直接使用
  4. Django 之Form
  5. Leetcode 208. 实现 Trie (前缀树) 解题思路及C++实现
  6. 如何免费注册Coursera课程
  7. MySQL基础操作(一)
  8. docker 笔记(2) -- 镜像
  9. android将彩图转为黑白_Android逆向反编译代码注入APK过程思路分析
  10. Kaldi(A1)语音识别原理
  11. AJAX培训第二讲:使用AJAX框架(下)
  12. 清理windows10系统垃圾文件-bat批处理命令
  13. 【EI稳定检索】第二届计算机科学、电子信息工程和智能控制技术国际会议(CEI 2022)
  14. JAVA跑步计时器app_坚持跑步神器app
  15. PMP笔记 第6章 项目进度管理
  16. 知道君推荐给大家一些写论文、搞科研、读大学必备的30款软件。
  17. 720度全景 html5代码,720web全景demo
  18. 网络编程六-网络编程相关面试题汇总
  19. Rhinoceros mac版(犀牛三维建模软件)中文版
  20. iOS 加密算法之MD5加密使用

热门文章

  1. 学习MongoDB(三) Add an Arbiter to Replica Set 集群中加入仲裁节点
  2. saltstack 安装nginx
  3. Open Flash Chart 初体验
  4. 2009年最佳80后科技创业者
  5. mysql内连接的自连接_mysql 内连接、外连接、自连接
  6. Eclipse控制项目的访问名称
  7. Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
  8. stm32串口通讯问题
  9. ActiveMQ无法启动
  10. Hibernate学习——建立一个简单的Hibernate项目