protected override void BuildType() { ConstructorBuilderHelper cb = Context.TypeBuilder.DefaultConstructor; cb = Context.TypeBuilder.TypeInitializer; cb = Context.TypeBuilder.InitConstructor; }
private void BuildMember(MemberInfo mi) { TypeBuilderHelper nestedType = _typeBuilder.DefineNestedType( "Accessor$" + mi.Name, TypeAttributes.NestedPrivate, typeof(MemberAccessor)); ConstructorBuilderHelper ctorBuilder = BuildNestedTypeConstructor(nestedType); BuildGetter(mi, nestedType); BuildSetter(mi, nestedType); BuildInitMember(mi, ctorBuilder); Type type = mi is FieldInfo ? ((FieldInfo)mi).FieldType : ((PropertyInfo)mi).PropertyType; BuildIsNull(mi, nestedType, type); if (type.IsEnum) { type = Enum.GetUnderlyingType(type); } string typedPropertyName = type.Name; if (type.IsGenericType) { Type underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != null) { BuildTypedGetterForNullable(mi, nestedType, underlyingType); BuildTypedSetterForNullable(mi, nestedType, underlyingType); if (underlyingType.IsEnum) { underlyingType = Enum.GetUnderlyingType(underlyingType); type = typeof(Nullable <>).MakeGenericType(underlyingType); } typedPropertyName = "Nullable" + underlyingType.Name; } else { typedPropertyName = null; } } if (typedPropertyName != null) { BuildTypedGetter(mi, nestedType, typedPropertyName); BuildTypedSetter(mi, nestedType, type, typedPropertyName); } BuildCloneValueMethod(mi, nestedType, type); // FW 1.1 wants nested types to be created before parent. // _nestedTypes.Add(nestedType); }
private void BuildInitMember(MemberInfo mi, ConstructorBuilderHelper ctorBuilder) { _typeBuilder.DefaultConstructor.Emitter .ldarg_0 .ldarg_0 .ldarg_0 .ldc_i4(mi is FieldInfo? 1: 2) .ldstr(mi.Name) .call(_accessorType.GetMethod("GetMember", typeof(int), typeof(string))) .newobj(ctorBuilder) .call(_accessorType.GetMethod("AddMember", typeof(MemberAccessor))) ; }
private static ConstructorBuilderHelper BuildNestedTypeConstructor(TypeBuilderHelper nestedType) { Type[] parameters = { typeof(TypeAccessor), typeof(MemberInfo) }; ConstructorBuilderHelper ctorBuilder = nestedType.DefinePublicConstructor(parameters); ctorBuilder.Emitter .ldarg_0 .ldarg_1 .ldarg_2 .call(TypeHelper.GetConstructor(typeof(MemberAccessor), parameters)) .ret() ; return(ctorBuilder); }
private void BuildInitMember(MemberInfo mi, ConstructorBuilderHelper ctorBuilder) { _typeBuilder.DefaultConstructor.Emitter .ldarg_0 .ldarg_0 .ldarg_0 .ldc_i4 (mi is FieldInfo? 1: 2) .ldstr (mi.Name) .call (_accessorType.GetMethod("GetMember", typeof(int), typeof(string))) .newobj (ctorBuilder) .call (_accessorType.GetMethod("AddMember", typeof(MemberAccessor))) ; }
private static Type EnsureDelegateType(BuildContext context, MethodInfo method) { // The delegate should be defined as inner type of context.TypeBuilder. // It's possible, but we can not define and use newly defined type as Emit target in its owner type. // To solve this problem, we should create a top level delegate and make sure its name is unique. // string delegateName = context.TypeBuilder.TypeBuilder.FullName + "$" + method.Name + "$Delegate"; Type delegateType = (Type)context.Items[delegateName]; if (delegateType == null) { ParameterInfo[] pi = method.GetParameters(); Type[] parameters = new Type[pi.Length]; for (int i = 0; i < pi.Length; i++) { parameters[i] = pi[i].ParameterType; } const MethodImplAttributes mia = MethodImplAttributes.Runtime | MethodImplAttributes.Managed; const MethodAttributes ma = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual; TypeBuilderHelper delegateBuilder = context.AssemblyBuilder.DefineType(delegateName, TypeAttributes.Class | TypeAttributes.NotPublic | TypeAttributes.Sealed | TypeAttributes.AnsiClass | TypeAttributes.AutoClass, typeof(MulticastDelegate)); // Create constructor // ConstructorBuilderHelper ctorBuilder = delegateBuilder.DefineConstructor( MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.RTSpecialName, CallingConventions.Standard, typeof(object), typeof(IntPtr)); ctorBuilder.ConstructorBuilder.SetImplementationFlags(mia); MethodBuilderHelper methodBuilder; // Define the BeginInvoke method for the delegate // Type[] beginParameters = new Type[parameters.Length + 2]; Array.Copy(parameters, 0, beginParameters, 0, parameters.Length); beginParameters[parameters.Length] = typeof(AsyncCallback); beginParameters[parameters.Length + 1] = typeof(object); methodBuilder = delegateBuilder.DefineMethod("BeginInvoke", ma, typeof(IAsyncResult), beginParameters); methodBuilder.MethodBuilder.SetImplementationFlags(mia); // Define the EndInvoke method for the delegate // methodBuilder = delegateBuilder.DefineMethod("EndInvoke", ma, method.ReturnType, typeof(IAsyncResult)); methodBuilder.MethodBuilder.SetImplementationFlags(mia); // Define the Invoke method for the delegate // methodBuilder = delegateBuilder.DefineMethod("Invoke", ma, method.ReturnType, parameters); methodBuilder.MethodBuilder.SetImplementationFlags(mia); context.Items[delegateName] = delegateType = delegateBuilder.Create(); } return(delegateType); }
private void BuildMember(MemberInfo mi) { bool isValueType = _originalType.IsValueType; TypeBuilderHelper nestedType = _typeBuilder.DefineNestedType( "Accessor$" + mi.Name, TypeAttributes.NestedPrivate, typeof(MemberAccessor)); ConstructorBuilderHelper ctorBuilder = BuildNestedTypeConstructor(nestedType); BuildGetter(mi, nestedType); if (!isValueType) { BuildSetter(mi, nestedType); } BuildInitMember(mi, ctorBuilder); Type type = mi is FieldInfo ? ((FieldInfo)mi).FieldType : ((PropertyInfo)mi).PropertyType; BuildIsNull(mi, nestedType, type); if (type.IsEnum) { type = Enum.GetUnderlyingType(type); } string typedPropertyName = type.Name; if (type.IsGenericType) { Type underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != null) { BuildTypedGetterForNullable(mi, nestedType, underlyingType); if (!isValueType) { BuildTypedSetterForNullable(mi, nestedType, underlyingType); } if (underlyingType.IsEnum) { // Note that PEVerify will complain on using Nullable<SomeEnum> as Nullable<Int32>. // It works in the current CLR implementation, bu may not work in future releases. // underlyingType = Enum.GetUnderlyingType(underlyingType); type = typeof(Nullable <>).MakeGenericType(underlyingType); } typedPropertyName = "Nullable" + underlyingType.Name; } else { typedPropertyName = null; } } if (typedPropertyName != null) { BuildTypedGetter(mi, nestedType, typedPropertyName); if (!isValueType) { BuildTypedSetter(mi, nestedType, type, typedPropertyName); } } if (!isValueType) { BuildCloneValueMethod(mi, nestedType, type); } // FW 1.1 wants nested types to be created before parent. // _nestedTypes.Add(nestedType); }