日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。