using Newtonsoft.Json.Linq;
using System.Reflection.Emit;
public static void Main()
var json = "{Title : 'Prova', Text:'Ciao'}";
CallService("Message", JObject.Parse(json));
Console.WriteLine("------------------------------------");
CallService("Message",new {Title="Prova",Text="Ciao"});
Console.WriteLine("------------------------------------");
CallService("Message", json.ToDynamicObject("TipoCreatoInRunTime"));
public static void CallService<T>(string service, T data)
var type = data.GetType();
Console.WriteLine($"Service: '{service}' type: {type}");
foreach(var property in type.GetProperties())
Console.WriteLine($"Name: '{property.Name}' Type: '{property.PropertyType}' Value: '{property.GetValue(data)}'");
Console.WriteLine($"Name: '{property.Name}' Type: '{property.PropertyType}'");
public static class StringExtension
public static dynamic ToDynamicObject(this string json, string typeName = "MyDynamicType")
MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.HideBySig;
AssemblyBuilder dynamicAssembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("MyDynamicAssembly"),
AssemblyBuilderAccess.Run);
ModuleBuilder dynamicModule = dynamicAssembly.DefineDynamicModule("MyDynamicAssemblyModule");
TypeBuilder dynamicType = dynamicModule.DefineType(typeName, TypeAttributes.Public);
JObject o = JObject.Parse(json);
o.Properties().ToList().ForEach(f =>
var propertyType = (f.Value as Newtonsoft.Json.Linq.JValue).Value.GetType();
FieldBuilder field = dynamicType.DefineField("_" + name, propertyType, FieldAttributes.Private);
PropertyBuilder property = dynamicType.DefineProperty(name, PropertyAttributes.None, propertyType,
MethodBuilder getMethodBuilder = dynamicType.DefineMethod("get_value", getSetAttr, propertyType,
ILGenerator getIl = getMethodBuilder.GetILGenerator();
getIl.Emit(OpCodes.Ldarg_0);
getIl.Emit(OpCodes.Ldfld, field);
MethodBuilder setMethodBuilder = dynamicType.DefineMethod("set_value", getSetAttr, null,
ILGenerator setIl = setMethodBuilder.GetILGenerator();
setIl.Emit(OpCodes.Ldarg_0);
setIl.Emit(OpCodes.Ldarg_1);
setIl.Emit(OpCodes.Stfld, field);
property.SetGetMethod(getMethodBuilder);
property.SetSetMethod(setMethodBuilder);
return JsonConvert.DeserializeObject(json, dynamicType.CreateType()); ;