public void TestClass2() { NClass builder = NClass.RandomDomain(); var mb = builder.GetMethodBuilder(); mb.Public().Name("Apple").Type <int>().Body("return 0;"); var pb = builder.GetPropertyBuilder(); pb.Public() .Name("Banana") .Type <NClass>() .Setter("int a = value.ToString().Length;") .Getter("return default;"); var script = builder .CustomUsing() .HiddenNamespace() .Access(Natasha.Reverser.Model.AccessFlags.Public) .Name("EnumUT1") .Script; Assert.Equal($"using System;{Environment.NewLine}using Natasha.CSharp;{Environment.NewLine}public class EnumUT1{{{Environment.NewLine}public System.Int32 Apple(){{return 0;}}{Environment.NewLine}public Natasha.CSharp.NClass Banana{{{Environment.NewLine}get{{return default;}}{Environment.NewLine}set{{int a = value.ToString().Length;}}{Environment.NewLine}}}{Environment.NewLine}}}", script); Assert.Equal($"using System;{Environment.NewLine}using Natasha.CSharp;{Environment.NewLine}public class EnumUT1{{{Environment.NewLine}public System.Int32 Apple(){{return 0;}}{Environment.NewLine}public Natasha.CSharp.NClass Banana{{{Environment.NewLine}get{{return default;}}{Environment.NewLine}set{{int a = value.ToString().Length;}}{Environment.NewLine}}}{Environment.NewLine}}}", script); Assert.NotNull(builder.GetType()); }
public void TestValue() { var runtime = new AnonymousRTD(); runtime.UseStaticReadonlyFields(); runtime.AddValue("小明"); runtime.AddValue("小明1"); runtime.AddValue("小明"); runtime.AddValue("name", "abc"); runtime.AddValue("name2", "abc"); var nClass = NClass.RandomDomain() .Public() .BodyAppendLine(runtime.FieldsScript) .BodyAppendLine(runtime.MethodScript); var type = nClass.GetType(); var action = runtime.GetInitMethod(nClass); action(); string result0 = nClass.DelegateHandler.Func <string>($"return {type.Name}._anonymous_1;")(); string result1 = nClass.DelegateHandler.Func <string>($"return {type.Name}._anonymous_2;")(); string result2 = nClass.DelegateHandler.Func <string>($"return {type.Name}._anonymous_3;")(); string result3 = nClass.DelegateHandler.Func <string>($"return {type.Name}.name;")(); string result4 = nClass.DelegateHandler.Func <string>($"return {type.Name}.name2;")(); Assert.Equal("小明1", result1); Assert.Equal("小明", result0); Assert.Equal("小明", result2); Assert.Equal("abc", result3); Assert.Equal("abc", result4); }
public void TestDelegate() { Func <string, int> ageFunc = item => item.Length; var runtime = new ReuseAnonymousRTD(); runtime.AddValue(ageFunc); runtime.AddValue(ageFunc); runtime.AddValue("name", "abc"); runtime.AddValue("name2", "abc"); var nClass = NClass.RandomDomain() .Public() .Inheritance <Test>() .BodyAppendLine(runtime.FieldsScript) .BodyAppendLine(runtime.MethodScript); var type = nClass.GetType(); Test test = (Test)Activator.CreateInstance(type); test.Age = 100; var action = runtime.GetInitMethod <Test>(nClass); action(test); var result = nClass.DelegateHandler.Func <Test, string, int>($"return (({type.Name})arg1).{runtime.GetFieldName(ageFunc)}(arg2);")(test, "Hello"); string result3 = nClass.DelegateHandler.Func <Test, string>($"return (({type.Name})arg).name;")(test); Assert.Equal("abc", result3); Assert.Equal(5, result); Assert.Equal(100, test.Age); }
public void TestValue() { var runtime = new ReuseAnonymousRTD(); runtime.UseReadonlyFields(); runtime.AddValue("小明"); runtime.AddValue("小明"); runtime.AddValue("小明1"); runtime.AddValue("name", "abc"); runtime.AddValue("name2", "abc"); var nClass = NClass.RandomDomain() .Public() .Inheritance <Test>() .BodyAppendLine(runtime.FieldsScript) .BodyAppendLine(runtime.MethodScript); var type = nClass.GetType(); Test test = (Test)Activator.CreateInstance(type); test.Age = 100; var action = runtime.GetInitMethod <Test>(nClass); action(test); string result = nClass.DelegateHandler.Func <Test, string>($"return (({type.Name})arg).{runtime.GetFieldName("小明")};")(test); string result3 = nClass.DelegateHandler.Func <Test, string>($"return (({type.Name})arg).name;")(test); Assert.Equal("小明", result); Assert.Equal("abc", result3); Assert.Equal(100, test.Age); }
public void Test5() { var type = NClass .RandomDomain() .Name("TRecord") .HiddenNamespace() .SkipInit() .Public() .RecordProperty <string>("P1") .RecordProperty <int>("P2") .GetType(); Assert.NotNull(type); }
public void TestClass() { NClass builder = NClass.RandomDomain(); var script = builder .CustomUsing() .HiddenNamespace() .Access(Natasha.Reverser.Model.AccessFlags.Public) .Name("EnumUT1") .Field(item => { item.Public().Name("Apple").Type <int>(); }) .Field(item => { item.Public().Name("Orange").Type <string>(); }) .Property(item => { item.Public().Name("Banana").Type <NClass>(); }) .Script; Assert.Equal($"using System;{Environment.NewLine}using Natasha.CSharp;{Environment.NewLine}public class EnumUT1{{{Environment.NewLine}public System.Int32 Apple;{Environment.NewLine}public System.String Orange;{Environment.NewLine}public Natasha.CSharp.NClass Banana{{{Environment.NewLine}get;{Environment.NewLine}set;{Environment.NewLine}}}{Environment.NewLine}}}", script); Assert.NotNull(builder.GetType()); }
public void TestDelegate() { Func <string, int> func = item => item.Length; Func <string, int> func1 = item => item.Length + 1; var runtime = new AnonymousRTD(); runtime.UseStaticFields(); var key = runtime.AddValue(func); runtime.AddValue(func1); runtime.AddValue(func); runtime.AddValue("name", "abc"); runtime.AddValue("name2", "abc"); var nClass = NClass.RandomDomain() .Public() .BodyAppendLine(runtime.FieldsScript) .BodyAppendLine(runtime.MethodScript); var type = nClass.GetType(); var action = runtime.GetInitMethod(nClass); action(); int result0 = nClass.DelegateHandler.Func <string, int>($"return {type.Name}.{key}(arg);")("hello"); int result1 = nClass.DelegateHandler.Func <string, int>($"return {type.Name}._anonymous_2(arg);")("hello"); int result2 = nClass.DelegateHandler.Func <string, int>($"return {type.Name}._anonymous_3(arg);")("hello"); string result3 = nClass.DelegateHandler.Func <string>($"return {type.Name}.name;")(); string result4 = nClass.DelegateHandler.Func <string>($"return {type.Name}.name2;")(); Assert.Equal(6, result1); Assert.Equal(5, result0); Assert.Equal(5, result2); Assert.Equal("abc", result3); Assert.Equal("abc", result4); }
public DynamicSwitchBuilder(IDictionary <TKey, TValue> pairs, Func <TKey, string> keyToCase = null) { int count = 0; var nClass = NClass.RandomDomain() .Public() .Inheritance <DynamicDictionaryBase <TKey, TValue> >() .Unsafe(); #if NET5_0 nClass.SkipInit(); #endif //构建快查字典 给BTF使用 var getValueMethodScript = new Dictionary <TKey, string>(); var tryGetValueMethodScript = new Dictionary <TKey, string>(); var setValueMethodSciprt = new Dictionary <TKey, string>(); foreach (var item in pairs) { count += 1; string field = _prefix + count; nClass.PrivateReadonlyField <TValue>(field); getValueMethodScript[item.Key] = $"return {field};"; tryGetValueMethodScript[item.Key] = $"value = {field};return true;"; setValueMethodSciprt[item.Key] = $"{field.ReadonlyScript()} = value;return;"; } //根据快查字典生成快查代码 //value GetValue(key) nClass.Method(method => { method .Param <TKey>("key") .Override() .Return <TValue>() .Name("GetValue") .Public() .BodyAppend(ScriptKeyAction(getValueMethodScript, "key", keyToCase)) .BodyAppend("return default;"); }); //bool TryGetValue(key,out value) nClass.Method(method => { method .Param <TKey>("key") .Param <TValue>("value", "out ") .Override() .Return <bool>() .Name("TryGetValue") .Public() .BodyAppend(ScriptKeyAction(tryGetValueMethodScript, "key", keyToCase)) .BodyAppend("value=default; return false;"); }); //Change(key,value) nClass.Method(method => { method .Param <TKey>("key") .Param <TValue>("value") .Override() .Name("Change") .Public() .BodyAppend(ScriptKeyAction(setValueMethodSciprt, "key", keyToCase)) .BodyAppend("throw new Exception(\"Can't find key!\");"); }); var ProxyType = nClass.GetType(); Instance = nClass .DelegateHandler .Func <DynamicDictionaryBase <TKey, TValue> >($"return new {ProxyType.GetDevelopName()}();")(); foreach (var item in pairs) { Instance.Change(item.Key, item.Value); } }