Natasha 高级编译类 (五)- 第一部分_环球新视野

来源:博客园 时间:2023-04-24 21:09:41


【资料图】

模板类的使用,类似于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("test").Body("int _test  = test;"))        // 属性        .Field(item => { item.Public().Name("Age").Type(); })        // 属性        .Field(item => { item.Public().Name("Name").Type(); })        // 封装的方法        .Property(item => { item.Public().Name("Obj").Type(); })        .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("ReadonlyField")    // 声明一个构造函数    .Ctor(item => item.Public().Body("ReadonlyField = 10;"))    // 私有变量声明    .PrivateField("_name", "[TestAttribute]")    // 声明了TestAttribute属性的Get方法    .Property(item => item        .Public()        .Attribute()        .Type()        .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("name")        .Body(@"_name = name;                            return _name;")        .Return>())    // 在命名空间中额外添加一个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());

运行结果

NRecord

应该是快速生成C# 9 的Record类型

NRecord builder = NRecord.DefaultDomain();var type = builder    .HiddenNamespace()    .AttributeAppend("[StructLayout(LayoutKind.Explicit)]")    .Access(AccessFlags.Public)    .Name("RecordTest")    .Field(item => { item.AttributeAppend("0").Public().Name("Apple").Type(); })    .Field(item => { item.AttributeAppend("0").Public().Name("Orange").Type(); })    .GetType();System.Console.WriteLine(builder.AssemblyBuilder.SyntaxTrees[0].ToString());

执行结果

未完待续。。。

标签:

x 广告
x 广告

Copyright ©  2015-2022 南极文旅网版权所有  备案号:粤ICP备2022077823号-13   联系邮箱: 317 493 128@qq.com