/// <summary> /// Defines a property that "exports;" 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); }