Fully converted over to ICodedOutputStream for all WriteTo derivations
diff --git a/src/ProtocolBuffers/AbstractMessage.cs b/src/ProtocolBuffers/AbstractMessage.cs
index 1e1ac1d..038fc0c 100644
--- a/src/ProtocolBuffers/AbstractMessage.cs
+++ b/src/ProtocolBuffers/AbstractMessage.cs
@@ -138,7 +138,7 @@
         /// of the message before the data, then making sure you limit the input to

         /// that size when receiving the data. Alternatively, use WriteDelimitedTo(Stream).

         /// </remarks>

-        public override void WriteTo(CodedOutputStream output)

+        public override void WriteTo(ICodedOutputStream output)

         {

             foreach (KeyValuePair<FieldDescriptor, object> entry in AllFields)

             {

@@ -149,26 +149,28 @@
                     // IEnumerable is the best we can do. (C# generics aren't covariant yet.)

                     IEnumerable valueList = (IEnumerable) entry.Value;

                     if (field.IsPacked)

-                    {

-                        output.WriteTag(field.FieldNumber, WireFormat.WireType.LengthDelimited);

-                        int dataSize = 0;

-                        foreach (object element in valueList)

-                        {

-                            dataSize += CodedOutputStream.ComputeFieldSizeNoTag(field.FieldType, element);

-                        }

-                        output.WriteRawVarint32((uint) dataSize);

-                        foreach (object element in valueList)

-                        {

-                            output.WriteFieldNoTag(field.FieldType, element);

-                        }

-                    }

+                        output.WritePackedArray(field.FieldType, field.FieldNumber, field.Name, valueList);

+                    //{

+                    //    output.WriteTag(field.FieldNumber, WireFormat.WireType.LengthDelimited);

+                    //    int dataSize = 0;

+                    //    foreach (object element in valueList)

+                    //    {

+                    //        dataSize += CodedOutputStream.ComputeFieldSizeNoTag(field.FieldType, element);

+                    //    }

+                    //    output.WriteRawVarint32((uint) dataSize);

+                    //    foreach (object element in valueList)

+                    //    {

+                    //        output.WriteFieldNoTag(field.FieldType, element);

+                    //    }

+                    //}

                     else

-                    {

-                        foreach (object element in valueList)

-                        {

-                            output.WriteField(field.FieldType, field.FieldNumber, field.Name, element);

-                        }

-                    }

+                        output.WriteArray(field.FieldType, field.FieldNumber, field.Name, valueList);

+                    //{

+                    //    foreach (object element in valueList)

+                    //    {

+                    //        output.WriteField(field.FieldType, field.FieldNumber, field.Name, element);

+                    //    }

+                    //}

                 }

                 else

                 {