Natasha 域(二)
Natasha的构成
Natasha官网给出的例子中(例子),用了两种方式去完成了同一件事情
这两种方式也是Natasha脚本构建器的重要组成部分,Complier编译器和Template模板。
- Complier编译器 白话就是自己写一个cs代码,然后由Natasha动态编译
- AssemblyCSharpBuilder
- OopBuilder 构建对象模板
- MethodBuilder 构建方法模板
- Template模板 自己写那么多代码不方便,就按照Natasha提供的方法进行编码,这样只需要关注核心业务模块即可
域
-
类似于不同的dll或者命名空间,各部分代码都相互独立
-
通过设置域(UseDomain方法)后,域内的类或方法即可调用
-
创建域
//获取默认域,默认的域名为Default // 等于NatashaReferenceDomain.DefaultDomain NatashaManagement.GetDefaultDomain(); //获取随机域,NatashaReferenceDomain的name即为域名 NatashaManagement.CreateRandomDomain(); //获取指定名称的域 NatashaManagement.CreateDomain(string domainName);
-
域使用举例
public void Domain() { //预热 Natasha NatashaManagement.Preheating(); //创建默认的域 NatashaReferenceDomain management = NatashaManagement.GetDefaultDomain(); StringBuilder bodyCode = new StringBuilder(); //动态编译的代码 // 第一个参数为string,第二个为int // 运行后输入一个数值,系统根据带入的参数判断,选择第int个值并输出 bodyCode.Append("" + "string message = Console.ReadLine();" + "if (message != null){" + " string result = \"\";" + " if (message.Length <= arg2){" + " result = \"not find the message,the length less than \" + arg2;" + " }else{" + " result = $\" you find message is {message.Substring(arg2, 1)}\";" + " }" + " return $\"this params is {arg1}, {result}\";" + "}else{" + " return \"message is null\";" + "}"); var action = NDelegate // 使用默认的域 .UseDomain(management) // class名称为Demo2 .ConfigClass(item => item.Name("Demo2") // 这里如果不加载,必须自己引用所有相关的dll和类型,否则无法使用 // 如果公共的类中不包含,则必须单独引用 // .NoGlobalUsing() //不加载当前域编译产生的Using // 如果该域中其他类单独添加了引用,可以通过该方法不添加此引用 .NotLoadDomainUsing()) .Func<string, int, string>(bodyCode.ToString()); Console.WriteLine(action("测试", 2)); //复用上面的类和方法 var func = NDelegate // 默认的域 .UseDomain(management) // 调用 .Func<string>("return Demo2.Invoke(\"张三\",3);"); Console.WriteLine(func()); }
输出结果