static Type InterceptInterface(IBuilderContext context,
                                       Type typeToBuild,
                                       Type originalType,
                                       IEnumerable <KeyValuePair <MethodBase, List <IInterceptionHandler> > > handlers,
                                       ConstructorInfo ctor,
                                       object[] ctorParams)
        {
            // Create a wrapper class which implements the interface
            typeToBuild = InterfaceInterceptor.WrapInterface(originalType);

            // Create an instance of the concrete class using the policy data
            object wrappedObject = ctor.Invoke(ctorParams);

            // Create the proxy that's used by the wrapper
            ILEmitProxy proxy = new ILEmitProxy(handlers);

            // Create a new policy which calls the proper constructor
            ConstructorInfo           newConstructor = typeToBuild.GetConstructor(new Type[] { typeof(ILEmitProxy), originalType });
            ConstructorCreationPolicy newPolicy      =
                new ConstructorCreationPolicy(newConstructor,
                                              new ValueParameter <ILEmitProxy>(proxy),
                                              new ValueParameter(originalType, wrappedObject));

            context.Policies.Set <ICreationPolicy>(newPolicy, typeToBuild);

            // Return the wrapped type for building
            return(typeToBuild);
        }
        public override MethodBase GetMethodBaseForPolicy(Type typeRequested,
                                                          MethodBase method)
        {
            if (!typeRequested.IsInterface)
            {
                return(null);
            }

            ParameterInfo[] paramInfos = method.GetParameters();
            object[]        paramTypes = new object[paramInfos.Length];

            for (int idx = 0; idx < paramInfos.Length; ++idx)
            {
                if (paramInfos[idx].ParameterType.IsGenericParameter)
                {
                    paramTypes[idx] = paramInfos[idx].ParameterType.Name;
                }
                else
                {
                    paramTypes[idx] = paramInfos[idx].ParameterType;
                }
            }

            return(InterfaceInterceptor.FindMethod(method.Name, paramTypes, typeRequested.GetMethods()));
        }
            public void Overloads()
            {
                MethodInfo result1 = InterfaceInterceptor.FindMethod("Overload", new Type[0], typeof(IFoo <>).GetMethods());
                MethodInfo result2 = InterfaceInterceptor.FindMethod("Overload", new Type[] { typeof(int) }, typeof(IFoo <>).GetMethods());
                MethodInfo result3 = InterfaceInterceptor.FindMethod("Overload", new Type[] { typeof(double) }, typeof(IFoo <>).GetMethods());

                Assert.NotNull(result1);
                Assert.NotNull(result2);
                Assert.Null(result3);
                Assert.NotSame(result1, result2);
            }
        static TInterface WrapAndCreateType <TInterface, TConcrete>(IEnumerable <KeyValuePair <MethodBase, List <IInterceptionHandler> > > handlers)
            where TConcrete : TInterface
        {
            Type          wrappedType     = InterfaceInterceptor.WrapInterface(typeof(TInterface));
            ILEmitProxy   proxy           = new ILEmitProxy(handlers);
            object        target          = Activator.CreateInstance(typeof(TConcrete));
            List <object> wrappedCtorArgs = new List <object>();

            wrappedCtorArgs.Add(proxy);
            wrappedCtorArgs.Add(target);
            return((TInterface)Activator.CreateInstance(wrappedType, wrappedCtorArgs.ToArray()));
        }
            public void ParameterTypesNotMatching()
            {
                MethodInfo result = InterfaceInterceptor.FindMethod("ToString", new Type[] { typeof(int) }, typeof(Object).GetMethods());

                Assert.Null(result);
            }
            public void NonGenericClass()
            {
                MethodInfo result = InterfaceInterceptor.FindMethod("ToString", new Type[0], typeof(Object).GetMethods());

                Assert.Same(typeof(Object).GetMethod("ToString"), result);
            }
            public void MethodNotFound()
            {
                MethodInfo result = InterfaceInterceptor.FindMethod("ThisMethodDoesNotExist", new Type[0], typeof(Object).GetMethods());

                Assert.Null(result);
            }
            public void GenericClassNonGenericMethod()
            {
                MethodInfo result = InterfaceInterceptor.FindMethod("RemoveAt", new Type[] { typeof(int) }, typeof(IList <>).GetMethods());

                Assert.Same(typeof(IList <>).GetMethod("RemoveAt"), result);
            }
            public void GenericClassGenericMethodWithExtraGenerics()
            {
                MethodInfo result = InterfaceInterceptor.FindMethod("Bar", new object[] { "T", "T2" }, typeof(IFoo <>).GetMethods());

                Assert.Same(typeof(IFoo <>).GetMethod("Bar"), result);
            }
            public void GenericClassGenericMethod()
            {
                MethodInfo result = InterfaceInterceptor.FindMethod("Insert", new object[] { typeof(int), "T" }, typeof(IList <>).GetMethods());

                Assert.Same(typeof(IList <>).GetMethod("Insert"), result);
            }