internal static object GenerateClonerInternal(Type realType, bool asObject) { Type methodType = (asObject ? typeof(object) : realType); ModuleBuilder mb = TypeCreationHelper.GetModuleBuilder(); DynamicMethod dt = new DynamicMethod("DeepObjectCloner_" + realType.Name + "_" + Interlocked.Increment(ref _methodCounter), methodType, new Type[2] { methodType, typeof(DeepCloneState) }, mb, skipVisibility: true); dt.InitLocals = false; GenerateProcessMethod(dt.GetILGenerator(), realType, asObject && realType.IsValueType); Type funcType = typeof(Func <, , >).MakeGenericType(methodType, typeof(DeepCloneState), methodType); return(dt.CreateDelegate(funcType)); }
private static ShallowObjectCloner GenerateUnsafeCloner() { TypeBuilder builder = TypeCreationHelper.GetModuleBuilder().DefineType("ShallowSafeObjectClonerImpl", TypeAttributes.Public, typeof(ShallowObjectCloner)); ILGenerator iLGenerator = builder.DefineConstructor(MethodAttributes.Public, CallingConventions.HasThis, Type.EmptyTypes).GetILGenerator(); iLGenerator.Emit(OpCodes.Ldarg_0); iLGenerator.Emit(OpCodes.Call, typeof(ShallowObjectCloner).GetPrivateConstructors()[0]); iLGenerator.Emit(OpCodes.Ret); ILGenerator iLGenerator2 = builder.DefineMethod("DoCloneObject", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual, CallingConventions.HasThis, typeof(object), new Type[1] { typeof(object) }).GetILGenerator(); iLGenerator2.Emit(OpCodes.Ldarg_1); iLGenerator2.Emit(OpCodes.Call, typeof(object).GetPrivateMethod("MemberwiseClone")); iLGenerator2.Emit(OpCodes.Ret); return((ShallowObjectCloner)Activator.CreateInstance(builder.CreateType())); }