public Type GenerateProxyType(Type typeOfIMyDuck, Type typeOfOtherDuck)
        {
            TypeAttributes newAttributes = TypeAttributes.Public | TypeAttributes.Class;
            TypeBuilder    typeBuilder   = _moduleBuilder.DefineType(
                typeOfOtherDuck.Name + "_DuckTypingProxy" + Guid.NewGuid().ToString(), newAttributes);

            // Add interface implementation
            typeBuilder.AddInterfaceImplementation(typeOfIMyDuck);

            FieldBuilder targetField = typeBuilder.DefineField("target", typeOfOtherDuck, FieldAttributes.Private);

            foreach (MethodInfo mi in typeOfIMyDuck.GetMethods())
            {
                CodeGenUtil.CreateDelegateImplementation(typeBuilder, targetField, mi);
            }

            foreach (PropertyInfo pi in typeOfIMyDuck.GetProperties())
            {
                PropertyBuilder pb = typeBuilder.DefineProperty(
                    pi.Name,
                    pi.Attributes,
                    pi.PropertyType,
                    pi.GetIndexParameters().Select(param => param.ParameterType).ToArray()
                    );
                MethodInfo getMi = pi.GetGetMethod();
                if (getMi != null)
                {
                    MethodBuilder getMethod = CodeGenUtil.CreateDelegateImplementation(typeBuilder, targetField, getMi);
                    pb.SetGetMethod(getMethod);
                }

                MethodInfo setMi = pi.GetSetMethod();
                if (setMi != null)
                {
                    MethodBuilder setMethod = CodeGenUtil.CreateDelegateImplementation(typeBuilder, targetField, setMi);
                    pb.SetSetMethod(setMethod);
                }
            }

            //Constructor
            ConstructorBuilder ctorBuilder = typeBuilder.DefineConstructor(
                MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName,
                CallingConventions.HasThis,
                new Type[] { typeOfOtherDuck });

            ctorBuilder.DefineParameter(1, ParameterAttributes.None, "target");
            ILGenerator il = ctorBuilder.GetILGenerator();

            // Call base class constructor
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Call, CodeGenUtil.GetConstructorInfo(() => new object()));

            // Initialize the target field
            il.Emit(OpCodes.Ldarg_0);
            il.Emit(OpCodes.Ldarg_1);
            il.Emit(OpCodes.Stfld, targetField);
            il.Emit(OpCodes.Ret);

            Type result = typeBuilder.CreateType();

#if DEBUG
            _assemblyBuilder.Save(_assemblyName + ".dll");
#endif
            return(result);
        }