protected override void BuildType()
            {
                ConstructorBuilderHelper cb = Context.TypeBuilder.DefaultConstructor;

                cb = Context.TypeBuilder.TypeInitializer;
                cb = Context.TypeBuilder.InitConstructor;
            }
Пример #2
0
        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);
        }
Пример #3
0
 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)))
     ;
 }
Пример #4
0
        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);
        }
Пример #5
0
		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)))
				;
		}
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }