Example #1
0
        private void GenerateForInterface()
        {
            var attributes = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final;

            DefineConstructorForImplementationClass();

            //Methods
            foreach (var methodInfo in TypeToIntercept.GetMethods().Where(it => !it.IsSpecialName))
            {
                if (Interceptors.Contains(methodInfo))
                {
                    DefineInterceptableMethod(methodInfo, attributes);
                }
                else
                {
                    DefineNonInterceptableMethod(methodInfo, attributes);
                }
            }

            //Properties
            foreach (var property in TypeToIntercept.GetProperties())
            {
                var parameterTypes  = property.GetIndexParameters().Select(it => it.ParameterType).ToArray();
                var propertyBuilder = TypeBuilder.DefineProperty(property.Name, property.Attributes, property.PropertyType, parameterTypes);
                var getMethod       = property.GetMethod;
                if (null != getMethod)
                {
                    var getMethodBuilder = Interceptors.IsInterceptable(getMethod)
                        ? DefineInterceptableMethod(getMethod, attributes)
                        : DefineNonInterceptableMethod(getMethod, attributes);
                    propertyBuilder.SetGetMethod(getMethodBuilder);
                }
                var setMethod = property.SetMethod;
                if (null != setMethod)
                {
                    var setMethodBuilder = Interceptors.IsInterceptable(setMethod)
                        ? DefineInterceptableMethod(setMethod, attributes)
                        : DefineNonInterceptableMethod(setMethod, attributes);
                    propertyBuilder.SetGetMethod(setMethodBuilder);
                }
            }

            //Events
            foreach (var eventInfo in TypeToIntercept.GetEvents())
            {
                var eventBuilder = TypeBuilder.DefineEvent(eventInfo.Name, eventInfo.Attributes, eventInfo.EventHandlerType);
                eventBuilder.SetAddOnMethod(DefineNonInterceptableMethod(eventInfo.AddMethod, attributes));
                eventBuilder.SetRemoveOnMethod(DefineNonInterceptableMethod(eventInfo.RemoveMethod, attributes));
            }
        }