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()); }
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)); }