string GenerateMemberHasValueCondition (XmlTypeMapMember member, string ob, bool isValueList)
{
if (isValueList) {
- return ob + ".Length > " + member.GlobalIndex;
+ if (member.IsOptionalValueType)
+ return ob + ".Length > " + Math.Max (member.GlobalIndex, member.SpecifiedGlobalIndex) + " && " + GetCast (typeof(bool), ob + "[" + member.SpecifiedGlobalIndex + "]");
+ else
+ return ob + ".Length > " + member.GlobalIndex;
}
else if (member.DefaultValue != System.DBNull.Value) {
string mem = ob + ".@" + member.Name;
void GenerateSetMemberValue (XmlTypeMapMember member, string ob, string value, bool isValueList)
{
- if (isValueList) WriteLine (ob + "[" + member.GlobalIndex + "] = " + value + ";");
+ GenerateSetMemberValue (member, ob, value, isValueList, false);
+ }
+
+ void GenerateSetMemberValue (XmlTypeMapMember member, string ob, string value, bool isValueList, bool initializingMember)
+ {
+ if (isValueList) {
+ WriteLine (ob + "[" + member.GlobalIndex + "] = " + value + ";");
+ if (member.IsOptionalValueType) {
+ string val = initializingMember ? "false" : "true";
+ WriteLine (ob + "[" + member.SpecifiedGlobalIndex + "] = " + val + ";");
+ }
+ }
else {
WriteLine (ob + ".@" + member.Name + " = " + value + ";");
- if (member.IsOptionalValueType)
- WriteLine (ob + "." + member.Name + "Specified = true;");
+ if (member.IsOptionalValueType) {
+ string val = initializingMember ? "false" : "true";
+ WriteLine (ob + "." + member.Name + "Specified = " + val + ";");
+ }
}
}
if (member.TypeData.Type.IsEnum)
value = GetCast (member.TypeData.Type, value);
- GenerateSetMemberValue (member, ob, value, isValueList);
+ GenerateSetMemberValue (member, ob, value, isValueList, true);
}
string GenerateReadObjectElement (XmlTypeMapElementInfo elem)
{
// Reset (); Disabled. See ChangeLog
- XmlMemberMapping[] mapping = new XmlMemberMapping[members.Length];
+ ArrayList mapping = new ArrayList ();
for (int n=0; n<members.Length; n++)
{
+ if (members[n].XmlAttributes.XmlIgnore) continue;
XmlTypeMapMember mapMem = CreateMapMember (null, members[n], ns);
- mapping[n] = new XmlMemberMapping (members[n].MemberName, ns, mapMem, false);
+ mapMem.GlobalIndex = n;
+ mapMem.CheckOptionalValueType (members);
+ mapping.Add (new XmlMemberMapping (members[n].MemberName, ns, mapMem, false));
}
elementName = XmlConvert.EncodeLocalName (elementName);
- XmlMembersMapping mps = new XmlMembersMapping (elementName, ns, hasWrapperElement, false, mapping);
+ XmlMembersMapping mps = new XmlMembersMapping (elementName, ns, hasWrapperElement, false, (XmlMemberMapping[])mapping.ToArray (typeof(XmlMemberMapping)));
mps.RelatedMaps = relatedMaps;
mps.Format = SerializationFormat.Literal;
Type[] extraTypes = includedTypes != null ? (Type[])includedTypes.ToArray(typeof(Type)) : null;
void SetMemberValue (XmlTypeMapMember member, object ob, object value, bool isValueList)
{
- if (isValueList) ((object[])ob)[member.GlobalIndex] = value;
- else {
+ if (isValueList)
+ ((object[])ob)[member.GlobalIndex] = value;
+ else
member.SetValue (ob, value);
- if (member.IsOptionalValueType)
- member.SetValueSpecified (ob, true);
- }
+ if (member.IsOptionalValueType)
+ member.SetValueSpecified (ob, true);
}
void SetMemberValueFromAttr (XmlTypeMapMember member, object ob, object value, bool isValueList)
bool MemberHasValue (XmlTypeMapMember member, object ob, bool isValueList)
{
if (isValueList) {
+ if (member.IsOptionalValueType && !member.GetValueSpecified (ob))
+ return false;
return member.GlobalIndex < ((object[])ob).Length;
}
else if (member.DefaultValue != System.DBNull.Value) {
string _name;
int _index;
int _globalIndex;
+ int _specifiedGlobalIndex = -1;
TypeData _typeData;
MemberInfo _member;
MemberInfo _specifiedMember;
set { _globalIndex = value; }
}
+ public int SpecifiedGlobalIndex
+ {
+ get { return _specifiedGlobalIndex; }
+ }
+
public bool IsOptionalValueType
{
get { return (_flags & OPTIONAL) != 0; }
public void CheckOptionalValueType (Type type)
{
+ // Used when reflecting a type
if (_member == null) InitMember (type);
IsOptionalValueType = (_specifiedMember != null);
}
+ public void CheckOptionalValueType (XmlReflectionMember[] members)
+ {
+ // Used when reflecting a list of members (e.g. web service parameters)
+ for (int n=0; n<members.Length; n++) {
+ XmlReflectionMember m = members [n];
+ if (m.MemberName == Name + "Specified" && m.MemberType == typeof(bool) && m.XmlAttributes.XmlIgnore) {
+ IsOptionalValueType = true;
+ _specifiedGlobalIndex = n;
+ break;
+ }
+ }
+ }
+
public bool GetValueSpecified (object ob)
{
- if (_specifiedMember is PropertyInfo) return (bool) ((PropertyInfo)_specifiedMember).GetValue (ob, null);
- else return (bool) ((FieldInfo)_specifiedMember).GetValue (ob);
+ if (_specifiedGlobalIndex != -1) {
+ object[] array = (object[])ob;
+ return _specifiedGlobalIndex < array.Length && (bool) array [_specifiedGlobalIndex];
+ }
+ else if (_specifiedMember is PropertyInfo)
+ return (bool) ((PropertyInfo)_specifiedMember).GetValue (ob, null);
+ else
+ return (bool) ((FieldInfo)_specifiedMember).GetValue (ob);
}
public void SetValueSpecified (object ob, bool value)
{
- if (_specifiedMember is PropertyInfo) ((PropertyInfo)_specifiedMember).SetValue (ob, value, null);
- else ((FieldInfo)_specifiedMember).SetValue (ob, value);
+ if (_specifiedGlobalIndex != -1)
+ ((object[])ob) [_specifiedGlobalIndex] = value;
+ else if (_specifiedMember is PropertyInfo)
+ ((PropertyInfo)_specifiedMember).SetValue (ob, value, null);
+ else
+ ((FieldInfo)_specifiedMember).SetValue (ob, value);
}
public virtual bool RequiresNullable {
public void AddMember (XmlTypeMapMember member)
{
- member.GlobalIndex = _allMembers.Count;
_allMembers.Add (member);
if (!(member.DefaultValue is System.DBNull) && member.DefaultValue != null) {