private void WriteMember(XmlWriter writer, Object obj, MemberInfo mi,
                                 IXmlRpcStreamConfig config, ITypeSerializerFactory typeSerializerFactory, IList nestedObjs)
        {
            if (Attribute.IsDefined(mi, typeof(XmlRpcIgnoreAttribute)))
            {
                return;
            }

            Object value = null;

            if (mi is PropertyInfo)
            {
                value = ((PropertyInfo)mi).GetValue(obj, null);
            }
            else if (mi is FieldInfo)
            {
                value = ((FieldInfo)mi).GetValue(obj);
            }

            MissingMemberAction action = config.MissingMemberAction;
            // TODO check member attribute

            XmlRpcMemberAttribute ma = (XmlRpcMemberAttribute)Attribute.GetCustomAttribute(mi, typeof(XmlRpcMemberAttribute));
            String memberName        = (ma != null && !String.IsNullOrEmpty(ma.Name)) ? ma.Name : mi.Name;

            if (value == null)
            {
                if (action == MissingMemberAction.Ignore)
                {
                    return;
                }
                else if (action == MissingMemberAction.Error)
                {
                    throw new XmlRpcException("Missing non-optional member: " + memberName);
                }
            }

            writer.WriteStartElement(XmlRpcSpec.MEMBER_TAG);
            writer.WriteElementString(XmlRpcSpec.MEMBER_NAME_TAG, memberName);
            WriteValue(writer, value, config, typeSerializerFactory, nestedObjs);
            writer.WriteEndElement();
        }
 public XmlRpcMissingMemberAttribute(MissingMemberAction action)
 {
     Action = action;
 }
 public XmlRpcMissingMemberAttribute(MissingMemberAction action)
 {
     Action = action;
 }