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