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());
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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());
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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);
            }
        }