示例#1
0
        /// <summary>
        /// Writes the complex property (nested object).
        /// </summary>
        private static void WriteComplexProperty(object obj, XmlWriter writer, Type valueType)
        {
            var props = GetNonDefaultProperties(obj).ToList();

            // Specify type for interfaces and abstract classes
            if (valueType.IsAbstract)
            {
                writer.WriteAttributeString(TypNameAttribute, TypeStringConverter.Convert(obj.GetType()));
            }

            // Write attributes
            foreach (var prop in props.Where(p => IsBasicType(p.PropertyType)))
            {
                var converter   = GetConverter(prop, prop.PropertyType);
                var stringValue = converter.ConvertToInvariantString(prop.GetValue(obj, null));
                writer.WriteAttributeString(PropertyNameToXmlName(prop.Name), stringValue ?? "");
            }

            // Write elements
            foreach (var prop in props.Where(p => !IsBasicType(p.PropertyType)))
            {
                WriteElement(prop.GetValue(obj, null), writer, PropertyNameToXmlName(prop.Name),
                             prop.PropertyType, prop);
            }
        }
        /// <summary>
        /// Writes the complex property (nested object).
        /// </summary>
        private static void WriteComplexProperty(object obj, XmlWriter writer, Type valueType)
        {
            var props = GetNonDefaultProperties(obj).OrderBy(x => x.Name).ToList();

            var realType = obj.GetType();

            // Specify type when it differs from declared type.
            if (valueType != realType)
            {
                writer.WriteAttributeString(TypNameAttribute, TypeStringConverter.Convert(obj.GetType()));
            }

            if (IsBasicType(obj.GetType()))
            {
                WriteBasicProperty(obj, writer, realType, null);
                return;
            }

            // Write attributes
            foreach (var prop in props.Where(p => IsBasicType(p.PropertyType) && !IsObsolete(p)))
            {
                var converter   = GetConverter(prop, prop.PropertyType);
                var stringValue = converter.ConvertToInvariantString(prop.GetValue(obj, null));
                writer.WriteAttributeString(PropertyNameToXmlName(prop.Name), stringValue ?? "");
            }

            // Write elements
            foreach (var prop in props.Where(p => !IsBasicType(p.PropertyType)))
            {
                WriteElement(prop.GetValue(obj, null), writer, PropertyNameToXmlName(prop.Name),
                             prop.PropertyType, prop);
            }
        }
        /// <summary>
        /// Writes the complex property (nested object).
        /// </summary>
        private static void WriteComplexProperty(object obj, XmlWriter writer, Type valueType)
        {
            if (obj == null)
            {
                // Happens with reference-type properties that have non-null default value.
                // Example: IgniteClientConfiguration.Logger
                writer.WriteAttributeString(TypNameAttribute, TypNameNull);
                return;
            }

            var props = GetNonDefaultProperties(obj).OrderBy(x => x.Name).ToList();

            var realType = obj.GetType();

            // Specify type when it differs from declared type.
            if (valueType != realType)
            {
                writer.WriteAttributeString(TypNameAttribute, TypeStringConverter.Convert(obj.GetType()));
            }

            if (IsBasicType(obj.GetType()))
            {
                WriteBasicProperty(obj, writer, realType, null);
                return;
            }

            // Write attributes
            foreach (var prop in props.Where(p => IsBasicType(p.PropertyType) && !IsIgnored(p)))
            {
                var converter   = GetConverter(prop, prop.PropertyType);
                var stringValue = converter.ConvertToInvariantString(prop.GetValue(obj, null));
                writer.WriteAttributeString(PropertyNameToXmlName(prop.Name), stringValue ?? "");
            }

            // Write elements
            foreach (var prop in props.Where(p => !IsBasicType(p.PropertyType)))
            {
                WriteElement(prop.GetValue(obj, null), writer, PropertyNameToXmlName(prop.Name),
                             prop.PropertyType, prop);
            }
        }