types/dynamic: make Message implement legacy message interface

It's annoying for some users that they can't directly pass
*dynamicpb.Message to APIs that expect the legacy message interfaces.
The proto.MessageV1 wrappers work, but is somewhat suspect since they
were originally designed to wrap legacy generated messages.

Change-Id: I0f9900dcd1c9865c754551f8763680c9bb904813
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/223817
Reviewed-by: Damien Neil <dneil@google.com>
diff --git a/types/dynamicpb/dynamic.go b/types/dynamicpb/dynamic.go
index f206c18..86371cf 100644
--- a/types/dynamicpb/dynamic.go
+++ b/types/dynamicpb/dynamic.go
@@ -36,6 +36,12 @@
 	unknown pref.RawFields
 }
 
+var (
+	_ pref.Message         = (*Message)(nil)
+	_ pref.ProtoMessage    = (*Message)(nil)
+	_ protoiface.MessageV1 = (*Message)(nil)
+)
+
 // NewMessage creates a new message with the provided descriptor.
 func NewMessage(desc pref.MessageDescriptor) *Message {
 	return &Message{
@@ -45,6 +51,9 @@
 	}
 }
 
+// ProtoMessage implements the legacy message interface.
+func (m *Message) ProtoMessage() {}
+
 // ProtoReflect implements the protoreflect.ProtoMessage interface.
 func (m *Message) ProtoReflect() pref.Message {
 	return m
@@ -55,6 +64,13 @@
 	return protoimpl.X.MessageStringOf(m)
 }
 
+// Reset clears the message to be empty, but preserves the dynamic message type.
+func (m *Message) Reset() {
+	m.known = make(map[pref.FieldNumber]pref.Value)
+	m.ext = make(map[pref.FieldNumber]pref.FieldDescriptor)
+	m.unknown = nil
+}
+
 // Descriptor returns the message descriptor.
 func (m *Message) Descriptor() pref.MessageDescriptor {
 	return m.typ.desc