Beispiel #1
0
        /// <summary>
        /// Defines a property that &quot;exports;&quot; a given field or constant.
        /// </summary>
        /// <param name="name">The name of the property.</param>
        /// <param name="member">A <see cref="PhpField"/> or <see cref="ClassConstant"/>.</param>
        /// <returns>The export property builder.</returns>
        public static PropertyBuilder /*!*/ DefineFieldExport(string name, DMember /*!*/ member)
        {
            Debug.Assert(member is PhpField || member is ClassConstant);

            DTypeDesc   declaring_type_desc = member.DeclaringType.TypeDesc;
            TypeBuilder type_builder        = member.DeclaringPhpType.RealTypeBuilder;

            // determine name and type
            Type type = Types.Object[0];             // TODO: field/constant type hints?

            PropertyBuilder prop_builder = type_builder.DefineProperty(
                name,
                Reflection.Enums.ToPropertyAttributes(member.MemberDesc.MemberAttributes),
                type,
                Type.EmptyTypes);

            MethodAttributes accessor_attrs = Reflection.Enums.ToMethodAttributes(member.MemberDesc.MemberAttributes);
            bool             changed;

            // define getter
            MethodBuilder getter = type_builder.DefineMethod(
                GetNonConflictingMethodName(declaring_type_desc, "get_" + name, out changed),
                accessor_attrs,
                type,
                Type.EmptyTypes);

            getter.SetCustomAttribute(AttributeBuilders.DebuggerHidden);
            prop_builder.SetGetMethod(getter);

            // generate setter
            if (member is PhpField)
            {
                MethodBuilder setter = type_builder.DefineMethod(
                    GetNonConflictingMethodName(declaring_type_desc, "set_" + name, out changed),
                    accessor_attrs,
                    Types.Void,
                    new Type[] { type });

                setter.SetCustomAttribute(AttributeBuilders.DebuggerHidden);
                prop_builder.SetSetMethod(setter);
            }

            return(prop_builder);
        }