//private static void EmitDebuggerDisplay (TypeBuilder typeBuilder, Type proxyType, Type implType)
        //{
        //    var constructor = typeof(DebuggerDisplayAttribute).GetConstructor(new Type[] { typeof(string) });
        //    var arguments = new object[] { String.Format("DynamicProxy :: {0} => {1}", implType.FullName, proxyType.FullName) };
        //    var debuggerDisplay = new CustomAttributeBuilder(constructor, arguments);
        //    typeBuilder.SetCustomAttribute(debuggerDisplay);
        //}
        private static void EmitAdapterMethods(Type adapterType, AdapterEmitter emitter)
        {
            var methods = adapterType.IsClass
                          ? adapterType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic)
                                       .Where(m => CanOverrideMethod(m))
                          : adapterType.GetMethods()
                                       .Where(m => !m.IsSpecialName);

            foreach (var method in methods)
            {
                emitter.EmitMethod(method);
            }
        }
        private static void EmitAdapterProperties(Type adapterType, AdapterEmitter emitter)
        {
            var properties = adapterType.IsClass
                             ? adapterType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic)
                                          .Where(p => p.CanRead
                                                      ? CanOverrideMethod(p.GetGetMethod())
                                                      : p.CanWrite && CanOverrideMethod(p.GetSetMethod()))
                                          .ToArray()
                             : adapterType.GetProperties();

            if (properties.Length != 0)
            {
                foreach (var property in properties)
                {
                    if (property.GetIndexParameters().Any())
                    {
                        emitter.EmitIndexer(property);
                    }
                    else
                    {
                        emitter.EmitProperty(property);
                    }
                }
            }
        }
        private static void EmitAdapterEvents(Type adapterType, AdapterEmitter emitter)
        {
            var events = adapterType.GetEvents();

            if (events.Length != 0)
            {
                foreach (var evt in events)
                {
                    emitter.EmitEvent(evt);
                }
            }
        }