//----------------------------------------------------------------------------------------------------------------------------------------------------- protected override TypeBuilder CreateTypeBuilder(DynamicModule module, string classFullName, Type baseType, ClassType containingClass) { return(containingClass.TypeBuilder.DefineNestedType( containingClass.TakeMemberName(classFullName, mustUseThisName: false), TypeAttributes.NestedPrivate, baseType)); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public PropertyMember(ClassType ownerClass, PropertyInfo declaration, FieldMember backingField = null) : base(ownerClass, declaration.Name) { m_Writers = new List <PropertyWriterBase>(); m_Declaration = declaration; m_PropertyBuilder = ownerClass.TypeBuilder.DefineProperty( ownerClass.TakeMemberName(declaration.Name, mustUseThisName: true), declaration.Attributes, declaration.PropertyType, declaration.GetIndexParameters().Select(p => p.ParameterType).ToArray()); var getterDeclaration = declaration.GetGetMethod(); if (getterDeclaration != null) { m_GetterMethod = new MethodMember(ownerClass, new VirtualMethodFactory(ownerClass, getterDeclaration)); m_PropertyBuilder.SetGetMethod((MethodBuilder)m_GetterMethod.MethodFactory.Builder); } var setterDeclaration = declaration.GetSetMethod(); if (setterDeclaration != null) { m_SetterMethod = new MethodMember(ownerClass, new VirtualMethodFactory(ownerClass, setterDeclaration)); m_PropertyBuilder.SetSetMethod((MethodBuilder)m_SetterMethod.MethodFactory.Builder); } m_BackingField = backingField; }
//----------------------------------------------------------------------------------------------------------------------------------------------------- internal FieldMember(ClassType ownerClass, string name, Type fieldType, bool isStatic = false, bool isPublic = false) : base(ownerClass, name) { m_IsStatic = isStatic; var actualType = TypeTemplate.Resolve(fieldType); var attributes = GetFieldAttributes(isStatic, isPublic); var uniqueName = ownerClass.TakeMemberName(name); m_FieldBuilder = ownerClass.TypeBuilder.DefineField(uniqueName, actualType, attributes); m_Writers = new List <FieldWriter>(); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public EventMember(ClassType ownerClass, EventInfo declaration) : base(ownerClass, declaration.Name) { m_Writers = new List <EventWriterBase>(); m_Declaration = declaration; m_UniqueName = ownerClass.TakeMemberName(declaration.Name); m_EventBuilder = ownerClass.TypeBuilder.DefineEvent( m_UniqueName, declaration.Attributes, declaration.EventHandlerType); m_AddMethod = new MethodMember(ownerClass, new VirtualMethodFactory(ownerClass, declaration.GetAddMethod())); m_EventBuilder.SetAddOnMethod((MethodBuilder)m_AddMethod.MethodFactory.Builder); m_RemoveMethod = new MethodMember(ownerClass, new VirtualMethodFactory(ownerClass, declaration.GetRemoveMethod())); m_EventBuilder.SetRemoveOnMethod((MethodBuilder)m_RemoveMethod.MethodFactory.Builder); }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public VirtualMethodFactory(ClassType type, MethodInfo declaration) { m_Declaration = declaration; m_MethodBuilder = type.TypeBuilder.DefineMethod( type.TakeMemberName(declaration.Name, mustUseThisName: true), GetMethodAttributesFor(declaration), declaration.ReturnType, declaration.GetParameters().Select(p => p.ParameterType).ToArray()); type.TypeBuilder.DefineMethodOverride(m_MethodBuilder, declaration); m_Signature = new MethodSignature(declaration); m_Parameters = m_Declaration.GetParameters().Select(p => m_MethodBuilder.DefineParameter(p.Position + 1, p.Attributes, p.Name)).ToArray(); if (!m_Signature.IsVoid) { m_ReturnParameter = m_MethodBuilder.DefineParameter(0, ParameterAttributes.Retval, strParamName: null); } }
//----------------------------------------------------------------------------------------------------------------------------------------------------- public AnonymousMethodFactory(ClassType type, MethodMember hostMethod, Type[] argumentTypes, Type returnType, bool isStatic, bool isPublic) { var resolvedArgumentTypes = argumentTypes.Select(TypeTemplate.Resolve).ToArray(); var resolvedReturnType = (returnType != null ? TypeTemplate.Resolve(returnType) : null); var methodAttributes = (MethodAttributes.Final | MethodAttributes.HideBySig | GetMethodModifierAttributes(isStatic, isPublic)); m_MethodBuilder = type.TypeBuilder.DefineMethod( type.TakeMemberName(GetAnonymousMethodName(hostMethod.Name)), methodAttributes, resolvedReturnType, resolvedArgumentTypes); m_Signature = new MethodSignature(isStatic, isPublic, resolvedArgumentTypes, returnType: resolvedReturnType); m_Parameters = resolvedArgumentTypes.Select((argType, argIndex) => m_MethodBuilder.DefineParameter( argIndex + 1, ParameterAttributes.None, "arg" + (argIndex + 1).ToString())).ToArray(); if (!m_Signature.IsVoid) { m_ReturnParameter = m_MethodBuilder.DefineParameter(0, ParameterAttributes.Retval, strParamName: null); } }