首页 > 其他分享 >Natasha 高级编译类 (五)- 第一部分

Natasha 高级编译类 (五)- 第一部分

时间:2023-04-24 18:01:11浏览次数:31  
标签:初始化 Name item 高级 name 编译 实例 Public Natasha

模板类的使用,类似于Lambda

类名 作用 命名空间 操作类型
NAssembly 快速创建同程序集的 oop 及委托等操作类 全局 静态初始化,动态实例化
NInstance 根据类型,提供一个初始化实例的委托 全局 静态
NDelegate 快速创建指定域的 Action/Func 委托 全局 静态初始化,动态实例化
NClass 快速创建一个公有类 全局 静态初始化,动态实例化
NInterface 快速创建一个公有接口 全局 静态初始化,动态实例化
NEnum 快速创建一个枚举类 全局 静态初始化,动态实例化
NRecord 快速创建一个记录类 全局 静态初始化,动态实例化
NStruct 快速创建一个结构体 全局 静态初始化,动态实例化
FakeMethodOperator 仿造 MethodInfo 创建方法 Natasha.CSharp 静态初始化,动态实例化
FastMethodOperator 快速创建方法 Natasha.CSharp 静态初始化,动态实例化

NClass

感觉该类的使用频率会比较高

注意:NClass可以通过获得Method后在进行方法调用,或者实例化以后

使用自带方法进行创建

NatashaManagement.Preheating();
using (NatashaManagement.CreateDomain("Test").CreateScope()){
    // 创建class
    NClass builder = NClass.UseScope();
    var type = builder
        // 不包含全局using
        .NoGlobalUsing()
        // 隐藏命名空间
        .HiddenNamespace()
        // 类的访问权限
        .Access(AccessFlags.Public)
        // 名称
        .Name("Demo5")
        // 带参构造函数
        .Ctor(item => item.Public().Param<int>("test").Body("int _test  = test;"))
        // 属性
        .Field(item => { item.Public().Name("Age").Type<int>(); })
        // 属性
        .Field(item => { item.Public().Name("Name").Type<string>(); })
        // 封装的方法
        .Property(item => { item.Public().Name("Obj").Type<NClass>(); })
        .GetType();
    var script = builder.AssemblyBuilder.SyntaxTrees[0].ToString();
    System.Console.WriteLine(script);
}

运行结果

另外附上一个较为全面的例子

//构建二 使用了上面例子的type
//添加了该引用一直无效果,因此直接将TestAttribute放到了代码中
NatashaManagement.AddGlobalReference(typeof(TestAttribute));
NClass builder2 = NClass.UseScope();
var type2 = builder2
    .Public()
    // 类名称
    .Name("Demo51")
    // 注释
    .Summary("This is a test class;")
    // 添加只读的int变量ReadonlyField
    .PublicReadonlyField<int>("ReadonlyField")
    // 声明一个构造函数
    .Ctor(item => item.Public().Body("ReadonlyField = 10;"))
    // 私有变量声明
    .PrivateField<string>("_name", "[TestAttribute]")
    // 声明了TestAttribute属性的Get方法
    .Property(item => item
        .Public()
        .Attribute<TestAttribute>()
        .Type<string>()
        .Name("NameProperty")
        .OnlyGetter("return _name;"))
    // Get/Set方法
    .Property(item => item
        .Public()
        .Type("AnotherClass")
        .Name("AnotherProperty"))
    // 名为SetName,参数为string的返回值为_name的虚方法
    .Method(item => item
        .Public()
        .Virtrual()
        .Async()
        .Name("SetName")
        .Param<string>("name")
        .Body(@"_name = name;
                            return _name;")
        .Return<Task<string>>())
    // 在命名空间中额外添加一个AnotherClass方法
    .NamespaceBodyAppend("public class AnotherClass{}")
    .NamespaceBodyAppend("public class TestAttribute : Attribute { }")
    .GetType();
var script2 = builder2.AssemblyBuilder.SyntaxTrees[0].ToString();
// 打印
System.Console.WriteLine(script2);

运行结果

NEnum

枚举类

//没啥好说的。。。。
NEnum builder = NEnum.DefaultDomain();
var type = builder
    .NoGlobalUsing()
    .HiddenNamespace()
    .Access(AccessFlags.Public)
    .Name("EnumDemo")
    .EnumField("Apple", 1, "苹果")
    .EnumField("Orange", 2)
    .EnumField("Banana", 4)
    .GetType();
System.Console.Write(builder.AssemblyBuilder.SyntaxTrees[0].ToString());

运行结果

未完待续。。。

标签:初始化,Name,item,高级,name,编译,实例,Public,Natasha
From: https://www.cnblogs.com/wanghun315/p/17350352.html

相关文章

  • Apple 的 plist 编辑器入门指南:基础操作与高级功能详解
     PlistEditPro是一款专为macOS编写的最高级属性列表Plist编辑器。对于Mac和IOS开发人员来说,编写应用程序时必须编辑各种列表文件。PlistEditPro通过提供直观且功能强大的界面,使编辑这些文件更加容易。它不仅能够复制和粘贴或拖放属性列表数据,还提供强大的搜索和替换功能,并......
  • Natasha 编译单元(四)
    AssemblyCSharpBuilder最基本编译单元,涵盖了编译流程所需的基本功能,包括创建域,加载dll文件,创建各种类,输出路径更换,调用特定域中的方法等。Natasha有两种方式编译流程,一种就是AssemblyCSharpBuilder,相比较而言,它是轻量级的,个人怀疑另一种编译流程的底层也是使用了AssemblyCS......
  • .NET Web入门到高级路线(新版本)
    .NETWeb入门到高级路线C#基础语法.NETCore基础知识ASP.NETCore基础知识概述BlazorASP.NETCore官方文档ORMFreeSqlEntityFrameworkCoreDapperSqlSugar关系型数据库SQLServerMySQLPostgreSQL中间件MongoDBRedisRabbitMQActiveMQSkyWalkingC......
  • idea - 在Terminal 交叉编译golang 解决
    1. 背景在ideaTerminal栏执行gobuildxxx.go打包的是exe文件交叉编译配置SETCGO_ENABLE=0SETGOOS=linuxSETGOARCH=arm64gobuildxxx.go发现编译文件仍然是exe2.解决需要切换为cmd指令执行cmd然后在执行交叉编译即可 ......
  • JS高级之手动实现new操作符
    相信大家都很好奇,在js中为什么函数在经过new操作之后会变成一个对象?functionFoot(params){this.name=params}Foot("aa")undefinednewFoot("aa")Foot {name:'aa'}实际上,new是一个语法糖从上面介绍中,我们可以看到new关键字主要做了以下的工作:创建一个新的对......
  • C程序的编译过程
    1,由.c文件到.i文件,这个过程叫预处理 2,由.i文件到.s文件,这个过程叫编译 3,由.s文件到.o文件,这个过程叫汇编 4,由.o文件到可执行文件,这个过程叫链接 【转】(146条消息)C程序的编译过程_c编译.i到.s文件_内存故障检测定位隔离的博客-CSDN博客......
  • 记录在vue3项目中使用wangeditor富文本编译器以及微信小程序中的渲染
    首先,管理后台中的使用npminstallwangeditor//f封装成了组件,以下是组件中的内容<template>  <divstyle="border:1pxsolid#ccc;maxwidth:600px">   <!--工具栏-->   <Toolbar    style="border-bottom:1pxsolid#ccc"    :......
  • dubbo高级特性
     ......
  • 每天打卡一小时 第十四天 编译四部曲
    第一部曲自然语言找到V的最大值最小值什么是V的最大值 A/B就是V的最大值很好理解将所有最大值找出来其中的最小值便是整体的最大值那么什么是V的最小值  通俗一点就是A差一点就可以被B+1整除(75+1)/4=1919便是最小值找出所有的最小值其中的最大值便是整体的......
  • Spring高级 - 第2部分
    10、RequestMappingHandlerMapping与RequestMappingHandlerAdapter代码演示:/***例如经常要用到请求头中的token信息,用下面的注解来标注由哪个参数来获取它*token=令牌*/@Target({ElementType.PARAMETER})@Retention(RetentionPolicy.RUNTIME)public@interf......