Skip to content

Commit d71cbd9

Browse files
New Crowdin translations by GitHub Action (#170)
Co-authored-by: Crowdin Bot <[email protected]>
1 parent fd0903c commit d71cbd9

File tree

8 files changed

+572
-26
lines changed

8 files changed

+572
-26
lines changed
Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
---
2-
title: 11. 编译模板 API速查表
2+
title: 包说明
33
---
44

55
<br/>
66

7-
| 类名 | 作用 | Namespaces | 操作类型 |
8-
| :----------------: | :---------------------: | :------------: | :---------: |
9-
| NAssembly | 快速创建同程序集的 oop 及委托等操作类 | 全局 | 静态初始化,动态实例化 |
10-
| NInstance | 根据类型,提供一个初始化实例的委托 | 全局 | 静态 |
11-
| NDelegate | 快速创建指定域的 Action/Func 委托 | 全局 | 静态初始化,动态实例化 |
12-
| NClass | 快速创建一个公有类 | 全局 | 静态初始化,动态实例化 |
13-
| NInterface | 快速创建一个公有接口 | 全局 | 静态初始化,动态实例化 |
14-
| NEnum | 快速创建一个枚举类 | 全局 | 静态初始化,动态实例化 |
15-
| NRecord | 快速创建一个记录类 | 全局 | 静态初始化,动态实例化 |
16-
| NStruct | 快速创建一个结构体 | 全局 | 静态初始化,动态实例化 |
17-
| FakeMethodOperator | 仿造 MethodInfo 创建方法 | Natasha.CSharp | 静态初始化,动态实例化 |
18-
| FastMethodOperator | 快速创建方法 | Natasha.CSharp | 静态初始化,动态实例化 |
7+
### 域实现包
8+
9+
`DotNetCore.Natasha.DynamicLoad.Base` 包为编译单元与域的粘合接口包,自定义实现域并给 Natasha 编译单元用。
10+
11+
`DotNetCore.Natasha.Domain` Natasha 官方的 Core3.0+ 域操作包。
12+
13+
`Natasha.CSharp.Compiler.Domain` 继承自 `DotNetCore.Natasha.Domain` 并实现了 `DotNetCore.Natasha.DynamicLoad.Base` 编译粘合接口包。
14+
15+
## 编译单元包
16+
17+
`DotNetCore.Natasha.CSharp.Compiler` Natasha 基础编译单元包。
18+
19+
### 扩展包
20+
21+
`DotNetCore.Natasha.CSharp.Template.Core` 在编译单元基础上构建的模板编译包。
22+
23+
`DotNetCore.Natasha.CSharp.Extension.Ambiguity` 在编译单元基础上扩展的解决二义性引用的包。
24+
25+
`DotNetCore.Natasha.CSharp.Extension.Codecov` 在编译单元基础上扩展的统计动态程序集使用率的包。
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: 1. 模板初始化操作
3+
---
4+
5+
Natasha 的所有模板均继承自 ComplierTemplate ,ComplierTemplate 本身会提供静态构造方法。因此上层 API 也会被支持。Therefore, the upper-level API is also supported.因此上层 API 也会被支持。
6+
7+
<br/>
8+
9+
## 使用
10+
11+
NDelegate / NAssembly / NClass.. / xxx_Oerator 等等以下称为 “Handler”.
12+
13+
<br/>
14+
15+
#### 静态初始化代码:
16+
17+
```cs
18+
19+
//使用 domain 域
20+
Handler.UseDomain(domian, compiler => { 编译器配置 });
21+
22+
23+
//使用某编译器的域
24+
Handler.UseCompiler(assemblyCSharpCompiler, compiler => { 编译器配置 }));
25+
26+
27+
//创建一个 "domainJim" 域
28+
Handler.CreateDomain("domianJim", compiler => { 编译器配置 });
29+
30+
31+
//使用默认域
32+
Handler.DefaultDomain(compiler => { 编译器配置 });
33+
34+
35+
//使用随机域
36+
Handler.RandomDomain(compiler => { 编译器配置 });
37+
38+
```
39+
40+
<br/>
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
---
2+
title: 2. 模板 API 用法展示(未更新)
3+
---
4+
5+
- **引入**
6+
7+
NUGET `DotNetCore.Natasha.CSharp`
8+
预热:
9+
10+
```C#
11+
NatashaInitializer.Preheating();
12+
```
13+
14+
- **NDelegate**
15+
16+
```cs
17+
//NDelegate 支持:
18+
19+
// 普通方法: Func/Action
20+
// 异步方法: Async Func/Action
21+
// 非安全方法: Unsafe Func/Action
22+
// 非安全异步方法: UnsafeAsync Func/Action
23+
24+
var func = NDelegate
25+
//创建域
26+
.CreateDomain("NDomain2")
27+
//在域中创建 Func<string,int> 方法, 参数与系统定义的 Func<T1,T> 参数名一样.
28+
.Func<string,int>("return arg.Length;");
29+
30+
Assert.Equal(3, func("abc"));
31+
//卸载
32+
DomainManagement.Remove("NDomain2");
33+
```
34+
35+
Or
36+
37+
```cs
38+
//或者
39+
var func = NDelegate
40+
//使用随机域
41+
.RandomDomain()
42+
//忽略第一个参数调用实例
43+
.WithFirstArgInvisible()
44+
//在域中创建 Func<string,int> 方法, 参数与系统定义的 Func<T1,T> 参数名一样.
45+
.Func<string,int>("return Length;");
46+
47+
Assert.Equal(3, func("abc"));
48+
//卸载
49+
func.DisposeDomain();
50+
```
51+
52+
```cs
53+
NormalTestModel model = new NormalTestModel();
54+
var func = NDelegate
55+
.CreateDomain("NDomain6")
56+
.Action<NormalTestModel, int, int>("arg1.Age=arg2+arg3;");
57+
func(model,1,2);
58+
Assert.Equal(3, model.Age);
59+
```
60+
61+
案例2:
62+
63+
```cs
64+
var action = NDelegate
65+
.DefaultDomain()
66+
.UnsafeAsyncFunc<string, string, Task<string>>(@"
67+
string result = arg1 +"" ""+ arg2;
68+
await Task.Delay(1000);
69+
Console.WriteLine(result);
70+
return result;");
71+
72+
string result = await action("Hello", "World1!");
73+
//result = "Hello World1!"
74+
```
75+
76+
<br/>
77+
78+
<br/>
79+
80+
#### FastMethodOperator
81+
82+
<br/>
83+
84+
- 普通定制
85+
86+
> 快速定制一个方法
87+
88+
```cs
89+
var action = FastMethodOperator.DefaultDomain()
90+
.Param<string>("str1")
91+
.Param(typeof(string),"str2")
92+
.Body("return str1+str2;")
93+
.Return<string>()
94+
.Complie<Func<string,string,string>>();
95+
96+
var result = action("Hello ","World!"); //result: "Hello World!"
97+
```
98+
99+
<br/>
100+
101+
```cs
102+
var delegateAction = FastMethodOperator.Random()
103+
104+
.Async()
105+
//如果不指定Param 和 Return 则默认使用 Func<string,string,Task<string>> 系统定义的参数名, F12 可看
106+
.Body(@"
107+
await Task.Delay(100);
108+
string result = arg1 +"" ""+ arg2;
109+
Console.WriteLine(result);
110+
return result;")
111+
112+
.Complie<Func<string, string, Task<string>>>();
113+
114+
string result = await delegateAction?.Invoke("Hello", "World2!"); //result: "Hello World2!"
115+
```
116+
117+
<br/>
118+
<br/>
119+
120+
#### DelegateOperator
121+
122+
> 快速快速实现委托
123+
124+
```cs
125+
126+
//定义一个委托
127+
public delegate string GetterDelegate(int value);
128+
129+
//方法一
130+
var action = NDelegate.RandomDomain().Delegate<GetterDelegate>("value += 101; return value.ToString();");
131+
string result = action(1);
132+
//result: "102"
133+
```
134+
135+
<br/>
136+
<br/>
137+
138+
#### FakeMethodOperator
139+
140+
> 快速复制方法并实现
141+
142+
```cs
143+
public class Test
144+
{
145+
public string Handler(string str)
146+
{
147+
return null;
148+
}
149+
}
150+
```
151+
152+
```cs
153+
var action = FakeMethodOperator.RandomDomain()
154+
.UseMethod(typeof(Test).GetMethod("Handler"))
155+
.StaticMethodContent(" str += \"hello\";return str; ")
156+
.Complie<Func<string,string>>();
157+
158+
string result = action("xiao");
159+
//result: "hello"
160+
```
161+
162+
<br/>
163+
<br/>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
---
2+
title: 4. 建议的封装规范
3+
---
4+
5+
## Natasha 封装规约
6+
7+
Natasha 有自己的封装规则,这可以让封装者思路更加清晰,并让作品更加容易维护。
8+
9+
<br/>
10+
11+
## 一个完整的 Operator
12+
13+
Operator 作为动态构建对外使用的操作类,一个 Operator 可大致由以下 3 部分组成:
14+
15+
- Template
16+
- Builder
17+
- Package / Extension
18+
19+
Template + Compiler => Builder
20+
Package(Builder) + API + Extension => Operator
21+
22+
<br/>
23+
24+
## 脚本构建器(Builder)
25+
26+
As the most important core part of Operator, Builder primarily provides delegates for Operator, can receive configurations from outside, can combine templates internally, and compiles them.<br x-id="2" />
27+
it is roughly divided into two parts, the Template template and the Compiler compiler:<br x-id="2" />
28+
it is roughly divided into two parts, the Template template and the Compiler compiler:\
29+
其大致分为两部分 Template 模板与 Compiler 编译器:
30+
31+
<br/>
32+
33+
- Template 构建模板
34+
使用 Template 模板构建运行时脚本字符串,模板对外暴漏 API 以方便使用者组成编译字符串。
35+
- UsingTemplat 是 Natasha 内置模板,提供了从命名空间到完整对象的代码构建。
36+
- DelegateTemplate 是 Natasha 内置模板,提供了方法代码的构建。
37+
- FieldTemplate 是 Natasha 内置模板,提供了字段代码的构建。
38+
- PropertyTemplate 是 Natasha 内置模板,提供了属性代码的构建。
39+
40+
<br/>
41+
42+
- Compiler 编译器
43+
编译器接收模板提供的字符串并进行编译,完成 Builder 的编译任务。
44+
- AssemblyCSharpBuilder : 使用 Natasha 的 CSharp 编译器可以轻松的完成字符串的编译和元数据的提取。
45+
46+
<br/>
47+
48+
直接使用 Natasha 内置的 Builder 可以快速实现定制,例如: OopBuilder[TOperator] ,MethodBuilder[Operator] 泛型方法。
49+
前者为其提供对象构造模板,后者专注构建方法。
50+
51+
<br/>
52+
53+
## 操作类(Operator)
54+
55+
Operator 在 Builder 的基础上进行了 Package 封装,Operator 存储了 Builder 提供的编译结果,对外暴漏用户级别的 API 。 <br/>
56+
57+
#### 案例
58+
59+
例如 Natasha 内置的 [FastMethodOperator](https://github.com/dotnetcore/Natasha/blob/master/src/Natasha.CSharp/Natasha.CSharp.Template/Api/Level1/Operator/FastMethodOperator.cs)[MethodBuilder](https://github.com/dotnetcore/Natasha/blob/master/src/Natasha.CSharp/Natasha.CSharp.Template/Builder/MethodBuilder.cs) 的基础上进行了包装和简化,FastMethodOpeartor 的初始化函数中定制了一个专属自己的脚本构建流程,如下模板翻译成 `public static`
60+
61+
```cs
62+
this.Access(AccessFlags.Public)
63+
.Modifier(ModifierFlags.Static);
64+
```
Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,25 @@
11
---
2-
title: 11. 编译模板 API速查表
2+
title: 包说明
33
---
44

55
<br/>
66

7-
| 类名 | 作用 | 命名空间 | 操作类型 |
8-
| :----------------: | :---------------------: | :------------: | :---------: |
9-
| NAssembly | 快速创建同程序集的 oop 及委托等操作类 | 全局 | 静态初始化,动态实例化 |
10-
| NInstance | 根据类型,提供一个初始化实例的委托 | 全局 | 静态 |
11-
| NDelegate | 快速创建指定域的 Action/Func 委托 | 全局 | 静态初始化,动态实例化 |
12-
| NClass | 快速创建一个公有类 | 全局 | 静态初始化,动态实例化 |
13-
| NInterface | 快速创建一个公有接口 | 全局 | 静态初始化,动态实例化 |
14-
| NEnum | 快速创建一个枚举类 | 全局 | 静态初始化,动态实例化 |
15-
| NRecord | 快速创建一个记录类 | 全局 | 静态初始化,动态实例化 |
16-
| NStruct | 快速创建一个结构体 | 全局 | 静态初始化,动态实例化 |
17-
| FakeMethodOperator | 仿造 MethodInfo 创建方法 | Natasha.CSharp | 静态初始化,动态实例化 |
18-
| FastMethodOperator | 快速创建方法 | Natasha.CSharp | 静态初始化,动态实例化 |
7+
### 域实现包
8+
9+
`DotNetCore.Natasha.DynamicLoad.Base` 包为编译单元与域的粘合接口包,自定义实现域并给 Natasha 编译单元用。
10+
11+
`DotNetCore.Natasha.Domain` Natasha 官方的 Core3.0+ 域操作包。
12+
13+
`Natasha.CSharp.Compiler.Domain` 继承自 `DotNetCore.Natasha.Domain` 并实现了 `DotNetCore.Natasha.DynamicLoad.Base` 编译粘合接口包。
14+
15+
## 编译单元包
16+
17+
`DotNetCore.Natasha.CSharp.Compiler` Natasha 基础编译单元包。
18+
19+
### 扩展包
20+
21+
`DotNetCore.Natasha.CSharp.Template.Core` 在编译单元基础上构建的模板编译包。
22+
23+
`DotNetCore.Natasha.CSharp.Extension.Ambiguity` 在编译单元基础上扩展的解决二义性引用的包。
24+
25+
`DotNetCore.Natasha.CSharp.Extension.Codecov` 在编译单元基础上扩展的统计动态程序集使用率的包。
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
title: 1. 模板初始化操作
3+
---
4+
5+
Natasha 的所有模板均继承自 ComplierTemplate ,ComplierTemplate 本身会提供静态构造方法。因此上层 API 也会被支持。
6+
7+
<br/>
8+
9+
## 使用
10+
11+
NDelegate / NAssembly / NClass.. / xxx_Oerator 等等以下称为 “Handler”.
12+
13+
<br/>
14+
15+
#### 静态初始化代码:
16+
17+
```cs
18+
19+
//使用 domain 域
20+
Handler.UseDomain(domian, compiler => { 编译器配置 });
21+
22+
23+
//使用某编译器的域
24+
Handler.UseCompiler(assemblyCSharpCompiler, compiler => { 编译器配置 }));
25+
26+
27+
//创建一个 "domainJim" 域
28+
Handler.CreateDomain("domianJim", compiler => { 编译器配置 });
29+
30+
31+
//使用默认域
32+
Handler.DefaultDomain(compiler => { 编译器配置 });
33+
34+
35+
//使用随机域
36+
Handler.RandomDomain(compiler => { 编译器配置 });
37+
38+
```
39+
40+
<br/>

0 commit comments

Comments
 (0)