static CustomDeserializationAction CreateCustomDeserializationAction(Type type)
{
ConstructorInfo ctor = type.GetConstructor(
BindingFlags.DeclaredOnly | BindingFlags.ExactBinding | BindingFlags.Instance
| BindingFlags.NonPublic | BindingFlags.Public,
null,
new Type [] { typeof(SerializationInfo), typeof(StreamingContext) },
null);
if (ctor == null)
throw new SerializationException("Could not find deserialization constructor for " + type.FullName);
DynamicMethod dynamicMethod = new DynamicMethod(
"CallCtor_" + type.Name,
MethodAttributes.Public | MethodAttributes.Static,
CallingConventions.Standard,
typeof(void), new [] { typeof(object), typeof(SerializationInfo), typeof(StreamingContext) },
type,
true);
ILGenerator il = dynamicMethod.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldarg_2);
il.Emit(OpCodes.Call, ctor);
il.Emit(OpCodes.Ret);
return (CustomDeserializationAction)dynamicMethod.CreateDelegate(typeof(CustomDeserializationAction));
}
#endregion