/// <summary>
        ///     Записать поле объекта, если оно не равно значению по умолчанию
        /// </summary>
        public void AddEnumField <T>(string name, T?value)
            where T : struct
        {
            if (value == null)
            {
                return;
            }

            AddFieldCore(name, EnumPrintFormatter.Print(value.Value));
        }
        /// <summary>
        ///     Записать поле объекта, если оно не равно значению по умолчанию
        /// </summary>
        public void AddEnumField <T>(string name, T value)
            where T : struct
        {
            if (Equals(value, default(T)))
            {
                return;
            }

            AddFieldCore(name, EnumPrintFormatter.Print(value));
        }
        internal static string FormatValue(string format, object arg, IFormatProvider formatProvider)
        {
            // Значения null форматируются как "null"
            if (ReferenceEquals(arg, null))
            {
                return(NullStr);
            }

            var printable = arg as IPrintable;

            if (!ReferenceEquals(printable, null))
            {
                var result   = Format(printable);
                var reusable = printable as IReusable;
                reusable?.Release();
                return(result);
            }

            var formattedValue = TryPrintKnownType(arg, format);

            if (formattedValue != null)
            {
                return(formattedValue);
            }

            // enum-ы выводятся в лог единообразно
            if (arg is Enum)
            {
                return(EnumPrintFormatter.Print(arg.GetType(), arg));
            }

            // IFormattable-объекты выводятся в лог как есть, с форматированием
            var formattable = arg as IFormattable;

            if (formattable != null)
            {
                return(formattable.ToString(format, formatProvider));
            }

            // Все прочее выводится как есть
            return(arg.ToString());
        }
 /// <summary>
 ///     Записать поле объекта, даже если оно равно значению по умолчанию
 /// </summary>
 public void AddEnumFieldRequired <T>(string name, T value)
     where T : struct
 {
     AddFieldCore(name, EnumPrintFormatter.Print(value));
 }