Пример #1
0
 /// <summary>
 /// Central interception point for well-known type formatting. Any well-known types which
 /// don't need special handling can fall back to WriteMessage. We avoid assuming that the
 /// values are using the embedded well-known types, in order to allow for dynamic messages
 /// in the future.
 /// </summary>
 private void WriteWellKnownTypeValue(TextWriter writer, MessageDescriptor descriptor, object value)
 {
     // Currently, we can never actually get here, because null values are always handled by the caller. But if we *could*,
     // this would do the right thing.
     if (value == null)
     {
         WriteNull(writer);
         return;
     }
     // For wrapper types, the value will either be the (possibly boxed) "native" value,
     // or the message itself if we're formatting it at the top level (e.g. just calling ToString on the object itself).
     // If it's the message form, we can extract the value first, which *will* be the (possibly boxed) native value,
     // and then proceed, writing it as if we were definitely in a field. (We never need to wrap it in an extra string...
     // WriteValue will do the right thing.)
     if (descriptor.IsWrapperType())
     {
         if (value is IMessage)
         {
             var message = (IMessage)value;
             value = message.Descriptor.Fields[WrappersReflection.WrapperValueFieldNumber].Accessor.GetValue(message);
         }
         WriteValue(writer, value);
         return;
     }
     if (descriptor.FullName == Timestamp.Descriptor.FullName)
     {
         WriteTimestamp(writer, (IMessage)value);
         return;
     }
     if (descriptor.FullName == Duration.Descriptor.FullName)
     {
         WriteDuration(writer, (IMessage)value);
         return;
     }
     if (descriptor.FullName == FieldMask.Descriptor.FullName)
     {
         WriteFieldMask(writer, (IMessage)value);
         return;
     }
     if (descriptor.FullName == Struct.Descriptor.FullName)
     {
         WriteStruct(writer, (IMessage)value);
         return;
     }
     if (descriptor.FullName == ListValue.Descriptor.FullName)
     {
         var fieldAccessor = descriptor.Fields[ListValue.ValuesFieldNumber].Accessor;
         WriteList(writer, (IList)fieldAccessor.GetValue((IMessage)value));
         return;
     }
     if (descriptor.FullName == Value.Descriptor.FullName)
     {
         WriteStructFieldValue(writer, (IMessage)value);
         return;
     }
     if (descriptor.FullName == Any.Descriptor.FullName)
     {
         WriteAny(writer, (IMessage)value);
         return;
     }
     WriteMessage(writer, (IMessage)value);
 }