public Type CreateType(MethodInfo methodInfo)
        {
            if (methodInfo == null)
            {
                throw new ArgumentNullException("methodInfo");
            }

            var typeBuilder = _typeRepository.DefineType("MethodInfo", typeof(MethodInfoBase));

            // Define generic parameters.
            var genericParameterTypes = typeBuilder.DefineGenericParameters(methodInfo.GetGenericArguments());

            var methodFieldInfo = typeBuilder.DefineField(
                "TargetMethod",
                typeof(MethodInfo),
                FieldAttributes.Private | FieldAttributes.Static | FieldAttributes.InitOnly);

            BuildTypeInitializer(typeBuilder, methodInfo, genericParameterTypes, methodFieldInfo);

            BuildConstructor(typeBuilder, methodFieldInfo);

            if (!methodInfo.IsAbstract && methodInfo.CanOverride())
            {
                BuildInvokeMethod(typeBuilder, methodInfo, genericParameterTypes, false);
            }

            BuildInvokeMethod(typeBuilder, methodInfo, genericParameterTypes, true);

            return(typeBuilder.CreateType());
        }
示例#2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ProxyTypeBuilder"/> class.
        /// </summary>
        /// <param name="typeRepository">The type repository.</param>
        /// <param name="parentType">The parent type.</param>
        public ProxyTypeBuilder(ITypeRepository typeRepository, Type parentType)
        {
            if (typeRepository == null)
            {
                throw new ArgumentNullException("typeRepository");
            }

            if (parentType == null)
            {
                throw new ArgumentNullException("parentType");
            }

            if (parentType.IsSealed)
            {
                throw new ArgumentException(Resources.ParentTypeMustNotBeSealed, "parentType");
            }

            if (parentType.IsGenericTypeDefinition)
            {
                throw new ArgumentException(Resources.ParentTypeMustNotBeAGenericTypeDefinition, "parentType");
            }

            _typeRepository = typeRepository;
            _parentType     = parentType;

            _typeBuilder = typeRepository.DefineType("Proxy", parentType);

            _invocationHandlerFieldInfo = _typeBuilder.DefineField(
                "_invocationHandler",
                typeof(IInvocationHandler),
                FieldAttributes.Private | FieldAttributes.InitOnly);

            _interfaceTypes = new HashSet <Type>();
        }
示例#3
0
        /// <inheritdoc/>
        public Type CreateType(MethodInfo methodInfo)
        {
            if (methodInfo == null)
            {
                throw new ArgumentNullException("methodInfo");
            }

            // Define type.
            var typeBuilder = _typeRepository.DefineType("MethodInfo", typeof(MethodInfoBase));

            // Define generic parameters.
            var genericParameterTypes = typeBuilder.DefineGenericParameters(methodInfo.GetGenericArguments());

            // Define method information static field.
            var methodFieldInfo = typeBuilder.DefineField(
                "innerMethod",
                typeof(MethodInfo),
                FieldAttributes.Private | FieldAttributes.Static | FieldAttributes.InitOnly);

            // Build type initializer.
            BuildTypeInitializer(typeBuilder, methodInfo, genericParameterTypes, methodFieldInfo);

            // Build constructor.
            BuildConstructor(typeBuilder, methodFieldInfo);

            // Build base invoke method only for non abstract and overrideable methods.
            if (!methodInfo.IsAbstract && methodInfo.CanOverride())
            {
                BuildInvokeMethod(typeBuilder, methodInfo, genericParameterTypes, false);
            }

            // Build virtual invoke method.
            BuildInvokeMethod(typeBuilder, methodInfo, genericParameterTypes, true);

            return(typeBuilder.CreateType());
        }
示例#4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="ProxyTypeBuilder"/> class.
        /// </summary>
        /// <param name="typeRepository">The type repository.</param>
        /// <param name="parentType">The parent type.</param>
        public ProxyTypeBuilder(ITypeRepository typeRepository, Type parentType)
        {
            if (typeRepository == null)
                throw new ArgumentNullException("typeRepository");

            if (parentType == null)
                throw new ArgumentNullException("parentType");

            if (parentType.IsSealed)
                throw new ArgumentException(Resources.ParentTypeMustNotBeSealed, "parentType");

            if (parentType.IsGenericTypeDefinition)
                throw new ArgumentException(Resources.ParentTypeMustNotBeAGenericTypeDefinition, "parentType");

            _typeRepository = typeRepository;
            _parentType = parentType;

            _typeBuilder = typeRepository.DefineType("Proxy" , parentType);

            _invocationHandlerFieldInfo = _typeBuilder.DefineField(
                "_invocationHandler",
                typeof (IInvocationHandler),
                FieldAttributes.Private | FieldAttributes.InitOnly);

            _interfaceTypes = new HashSet<Type>();
        }