public CompiledMethods(Type type) { #if UTF8JSON_EMIT { var dm = new DynamicMethod("serialize1", typeof(byte[]), new[] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // obj il.EmitUnboxOrCast(type); il.EmitLdarg(1); il.EmitCall(GetMethod(type, "Serialize", new[] { null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serialize1 = CreateDelegate <Func <object, IJsonFormatterResolver, byte[]> >(dm); } { var dm = new DynamicMethod("serialize2", null, new[] { typeof(Stream), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // stream il.EmitLdarg(1); il.EmitUnboxOrCast(type); il.EmitLdarg(2); il.EmitCall(GetMethod(type, "Serialize", new[] { typeof(Stream), null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serialize2 = CreateDelegate <Action <Stream, object, IJsonFormatterResolver> >(dm); } { var dm = new DynamicMethod("serialize3", null, new[] { typeof(JsonWriter).MakeByRefType(), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // ref writer il.EmitLdarg(1); il.EmitUnboxOrCast(type); il.EmitLdarg(2); il.EmitCall(GetMethod(type, "Serialize", new[] { typeof(JsonWriter).MakeByRefType(), null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serialize3 = CreateDelegate <SerializeJsonWriter>(dm); } { var dm = new DynamicMethod("serializeUnsafe", typeof(ArraySegment <byte>), new[] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // obj il.EmitUnboxOrCast(type); il.EmitLdarg(1); il.EmitCall(GetMethod(type, "SerializeUnsafe", new[] { null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serializeUnsafe = CreateDelegate <Func <object, IJsonFormatterResolver, ArraySegment <byte> > >(dm); } { var dm = new DynamicMethod("toJsonString", typeof(string), new[] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // obj il.EmitUnboxOrCast(type); il.EmitLdarg(1); il.EmitCall(GetMethod(type, "ToJsonString", new[] { null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); toJsonString = CreateDelegate <Func <object, IJsonFormatterResolver, string> >(dm); } { var dm = new DynamicMethod("Deserialize", typeof(object), new[] { typeof(string), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitCall(GetMethod(type, "Deserialize", new[] { typeof(string), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize1 = CreateDelegate <Func <string, IJsonFormatterResolver, object> >(dm); } { var dm = new DynamicMethod("Deserialize", typeof(object), new[] { typeof(byte[]), typeof(int), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitLdarg(2); il.EmitCall(GetMethod(type, "Deserialize", new[] { typeof(byte[]), typeof(int), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize2 = CreateDelegate <Func <byte[], int, IJsonFormatterResolver, object> >(dm); } { var dm = new DynamicMethod("Deserialize", typeof(object), new[] { typeof(Stream), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitCall(GetMethod(type, "Deserialize", new[] { typeof(Stream), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize3 = CreateDelegate <Func <Stream, IJsonFormatterResolver, object> >(dm); } { var dm = new DynamicMethod("Deserialize", typeof(object), new[] { typeof(JsonReader).MakeByRefType(), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // ref reader il.EmitLdarg(1); il.EmitCall(GetMethod(type, "Deserialize", new[] { typeof(JsonReader).MakeByRefType(), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize4 = CreateDelegate <DeserializeJsonReader>(dm); } #if NETSTANDARD { var dm = new DynamicMethod("SerializeAsync", typeof(System.Threading.Tasks.Task), new[] { typeof(Stream), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // stream il.EmitLdarg(1); il.EmitUnboxOrCast(type); il.EmitLdarg(2); il.EmitCall(GetMethod(type, "SerializeAsync", new[] { typeof(Stream), null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serializeAsync = CreateDelegate <Func <Stream, object, IJsonFormatterResolver, System.Threading.Tasks.Task> >(dm); } { var dm = new DynamicMethod("DeserializeAsync", typeof(System.Threading.Tasks.Task <object>), new[] { typeof(Stream), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitCall(GetMethod(type, "DeserializeAsync", new[] { typeof(Stream), typeof(IJsonFormatterResolver) })); il.EmitCall(typeof(CompiledMethods).GetMethod("TaskCast", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type)); il.Emit(OpCodes.Ret); deserializeAsync = CreateDelegate <Func <Stream, IJsonFormatterResolver, System.Threading.Tasks.Task <object> > >(dm); } #endif #endif }
public CompiledMethods(Type type) { { var dm = new DynamicMethod(nameof(serialize1), typeof(byte[]), new[] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // obj il.EmitUnboxOrCast(type); il.EmitLdarg(1); il.EmitCall(GetMethod(type, nameof(Serialize), new[] { null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serialize1 = CreateDelegate <Func <object, IJsonFormatterResolver, byte[]> >(dm); } { var dm = new DynamicMethod(nameof(serialize2), null, new[] { typeof(Stream), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // stream il.EmitLdarg(1); il.EmitUnboxOrCast(type); il.EmitLdarg(2); il.EmitCall(GetMethod(type, nameof(Serialize), new[] { typeof(Stream), null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serialize2 = CreateDelegate <Action <Stream, object, IJsonFormatterResolver> >(dm); } { var dm = new DynamicMethod(nameof(serialize3), null, new[] { typeof(JsonWriter).MakeByRefType(), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // ref writer il.EmitLdarg(1); il.EmitUnboxOrCast(type); il.EmitLdarg(2); il.EmitCall(GetMethod(type, nameof(Serialize), new[] { typeof(JsonWriter).MakeByRefType(), null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serialize3 = CreateDelegate <SerializeJsonWriter>(dm); } { var dm = new DynamicMethod(nameof(serializeUnsafe), typeof(ArraySegment <byte>), new[] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // obj il.EmitUnboxOrCast(type); il.EmitLdarg(1); il.EmitCall(GetMethod(type, nameof(SerializeUnsafe), new[] { null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serializeUnsafe = CreateDelegate <Func <object, IJsonFormatterResolver, ArraySegment <byte> > >(dm); } { var dm = new DynamicMethod(nameof(toJsonString), typeof(string), new[] { typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // obj il.EmitUnboxOrCast(type); il.EmitLdarg(1); il.EmitCall(GetMethod(type, nameof(ToJsonString), new[] { null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); toJsonString = CreateDelegate <Func <object, IJsonFormatterResolver, string> >(dm); } { var dm = new DynamicMethod(nameof(Deserialize), typeof(object), new[] { typeof(string), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitCall(GetMethod(type, nameof(Deserialize), new[] { typeof(string), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize1 = CreateDelegate <Func <string, IJsonFormatterResolver, object> >(dm); } { var dm = new DynamicMethod(nameof(Deserialize), typeof(object), new[] { typeof(byte[]), typeof(int), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitLdarg(2); il.EmitCall(GetMethod(type, nameof(Deserialize), new[] { typeof(byte[]), typeof(int), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize2 = CreateDelegate <Func <byte[], int, IJsonFormatterResolver, object> >(dm); } { var dm = new DynamicMethod(nameof(Deserialize), typeof(object), new[] { typeof(Stream), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitCall(GetMethod(type, nameof(Deserialize), new[] { typeof(Stream), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize3 = CreateDelegate <Func <Stream, IJsonFormatterResolver, object> >(dm); } { var dm = new DynamicMethod(nameof(Deserialize), typeof(object), new[] { typeof(JsonReader).MakeByRefType(), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // ref reader il.EmitLdarg(1); il.EmitCall(GetMethod(type, nameof(Deserialize), new[] { typeof(JsonReader).MakeByRefType(), typeof(IJsonFormatterResolver) })); il.EmitBoxOrDoNothing(type); il.Emit(OpCodes.Ret); deserialize4 = CreateDelegate <DeserializeJsonReader>(dm); } { var dm = new DynamicMethod(nameof(SerializeAsync), typeof(Task), new[] { typeof(Stream), typeof(object), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); // stream il.EmitLdarg(1); il.EmitUnboxOrCast(type); il.EmitLdarg(2); il.EmitCall(GetMethod(type, nameof(SerializeAsync), new[] { typeof(Stream), null, typeof(IJsonFormatterResolver) })); il.Emit(OpCodes.Ret); serializeAsync = CreateDelegate <Func <Stream, object, IJsonFormatterResolver, Task> >(dm); } { var dm = new DynamicMethod(nameof(DeserializeAsync), typeof(Task <object>), new[] { typeof(Stream), typeof(IJsonFormatterResolver) }, type.Module, true); var il = dm.GetILGenerator(); il.EmitLdarg(0); il.EmitLdarg(1); il.EmitCall(GetMethod(type, nameof(DeserializeAsync), new[] { typeof(Stream), typeof(IJsonFormatterResolver) })); il.EmitCall(typeof(CompiledMethods).GetMethod(nameof(TaskCast), BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(type)); il.Emit(OpCodes.Ret); deserializeAsync = CreateDelegate <Func <Stream, IJsonFormatterResolver, Task <object> > >(dm); } }