コード例 #1
0
        public void Test1()
        {
            var fields = new Dictionary <string, Type>
            {
                { "Height", typeof(decimal) },
                { "BirthDate", typeof(DateTime) },
                { "Hats", typeof(List <string>) },
            };

            var assemblyName    = new AssemblyName("DynamicTyping1");
            var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
            var moduleBuilder   = assemblyBuilder.DefineDynamicModule(assemblyName.Name);

            var typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public | TypeAttributes.Class);

            // static fields
            typeBuilder
            .WithField("Id", typeof(Guid))
            .WithField("Name", typeof(string));
            var(_, parentProperty)   = typeBuilder.AddIgnoredField("Parent", typeBuilder);
            var(_, childrenProperty) = typeBuilder.AddField("Children", typeof(List <>).MakeGenericType(typeBuilder));

            foreach (var(fieldName, fieldType) in fields)
            {
                typeBuilder.WithField(fieldName, fieldType);
            }

            var deserializeMethod = AddDeserializeActualMethod(typeBuilder, typeBuilder.AddDeserializeMethod(), parentProperty, childrenProperty);

            var type = typeBuilder.CreateType();

            _deserializeMethod = type.GetMethod(deserializeMethod.Name);
            var resolverType = new RadixResolverBuilder(moduleBuilder).Build(type);

            var path = @"C:\Projects\PactTest\DynamicTyping\DynamicTyping.Tests\bin\Debug\output2.dll";

            File.Delete(path);
            new AssemblyGenerator().GenerateAssembly(resolverType.Assembly, path);


            var input    = @"{""Id"":""00000000-0000-0000-0000-000000000001"",""Name"":""A"",""Height"":0,""BirthDate"":""0001-01-01T00:00:00"",""Hats"":[""Bowler""],""Children"":[{""Id"":""00000000-0000-0000-0000-000000000002"",""Name"":null,""Height"":1.5,""BirthDate"":""2001-01-01T00:00:00"",""Hats"":null,""Children"":null}]}";
            var instance = Deserialize(type, Encoding.UTF8.GetBytes(input));

            var str = JsonSerializer.ToJsonString(instance);

            _testOutputHelper.WriteLine(str);

            var resolver = (IResolver)Activator.CreateInstance(resolverType);

            _testOutputHelper.WriteLine(resolver.Resolve(instance, "Id").ToString());
            _testOutputHelper.WriteLine(resolver.Resolve(instance, "Missing").ToString());
        }
コード例 #2
0
        private static (Type Type, Type ResolverType, MethodInfo DeserializeMethod) CreateType()
        {
            var fields = new Dictionary <string, Type>
            {
                { "Name", typeof(string) },
            };

            for (var i = 1; i < 100; i++)
            {
                fields.Add($"DecimalProp{i}", typeof(decimal));
            }
            for (var i = 1; i < 100; i++)
            {
                fields.Add($"StringProp{i}", typeof(string));
            }

            var assemblyName    = new AssemblyName($"DynamicTyping{Guid.NewGuid():N}");
            var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
            var moduleBuilder   = assemblyBuilder.DefineDynamicModule(assemblyName.Name);

            var typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public | TypeAttributes.Class);

            // static fields
            typeBuilder
            .WithField("Id", typeof(Guid));
            var(_, parentProperty)   = typeBuilder.AddIgnoredField("Parent", typeBuilder);
            var(_, childrenProperty) = typeBuilder.AddField("Children", typeof(List <>).MakeGenericType(typeBuilder));

            foreach (var(fieldName, fieldType) in fields)
            {
                typeBuilder.WithField(fieldName, fieldType);
            }

            var innerDeserializeMethod = typeBuilder.AddDeserializeMethod();
            var deserializeMethod      = AddDeserializeActualMethod(typeBuilder, innerDeserializeMethod, parentProperty, childrenProperty);

            var type         = typeBuilder.CreateType();
            var resolverType = new RadixResolverBuilder(moduleBuilder).Build(type);

            return(type, resolverType, type.GetMethod(deserializeMethod.Name));
        }