Exemplo n.º 1
0
        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));
        }
Exemplo n.º 2
0
        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()));
        }