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)); } }