Browse Source

Use delegates instead of dynamic reflection.

Jon Skeet 17 years ago
parent
commit
272d384f6a

+ 10 - 2
csharp/ProtocolBuffers.Test/TestProtos/MessageWithNoOuter.cs

@@ -16,11 +16,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override MessageWithNoOuter ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<MessageWithNoOuter, MessageWithNoOuter.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter__FieldAccessorTable; }
     }
     }
     
     
@@ -40,11 +44,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.MultiFileProto.internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__FieldAccessorTable; }
         }
         }
         
         

+ 6 - 10
csharp/ProtocolBuffers.Test/TestProtos/MultiFileProto.cs

@@ -64,18 +64,14 @@ namespace Google.ProtocolBuffers.TestProtos {
     #region Static variables
     #region Static variables
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor 
         = Descriptor.MessageTypes[0];
         = Descriptor.MessageTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_MessageWithNoOuter__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor,
-            new string[] { "Nested", "Foreign", "NestedEnum", "ForeignEnum", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter),
-            typeof (global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter, global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Builder> internal__static_protobuf_unittest_MessageWithNoOuter__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter, global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Builder>(internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor,
+            new string[] { "Nested", "Foreign", "NestedEnum", "ForeignEnum", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__Descriptor 
         = internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor.NestedTypes[0];
         = internal__static_protobuf_unittest_MessageWithNoOuter__Descriptor.NestedTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__Descriptor,
-            new string[] { "I", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage),
-            typeof (global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage.Builder> internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_MessageWithNoOuter_NestedMessage__Descriptor,
+            new string[] { "I", });
     #endregion
     #endregion
     
     
   }
   }

+ 8 - 6
csharp/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs

@@ -43,11 +43,9 @@ namespace Google.ProtocolBuffers.TestProtos {
     #region Static variables
     #region Static variables
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor 
         = Descriptor.MessageTypes[0];
         = Descriptor.MessageTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor,
-            new string[] { "OptionalMessage", "RepeatedMessage", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize, global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize.Builder> internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize, global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize.Builder>(internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor,
+            new string[] { "OptionalMessage", "RepeatedMessage", });
     #endregion
     #endregion
     
     
   }
   }
@@ -66,11 +64,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestEmbedOptimizedForSize ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestEmbedOptimizedForSize, TestEmbedOptimizedForSize.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestEmbedOptimizeForProtoFile.internal__static_protobuf_unittest_TestEmbedOptimizedForSize__FieldAccessorTable; }
     }
     }
     
     

+ 8 - 6
csharp/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs

@@ -37,11 +37,9 @@ namespace Google.ProtocolBuffers.TestProtos {
     #region Static variables
     #region Static variables
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_import_ImportMessage__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_import_ImportMessage__Descriptor 
         = Descriptor.MessageTypes[0];
         = Descriptor.MessageTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_import_ImportMessage__Descriptor,
-            new string[] { "D", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.ImportMessage),
-            typeof (global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder> internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ImportMessage, global::Google.ProtocolBuffers.TestProtos.ImportMessage.Builder>(internal__static_protobuf_unittest_import_ImportMessage__Descriptor,
+            new string[] { "D", });
     #endregion
     #endregion
     
     
   }
   }
@@ -66,11 +64,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override ImportMessage ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<ImportMessage, ImportMessage.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestImportProtoFile.internal__static_protobuf_unittest_import_ImportMessage__FieldAccessorTable; }
     }
     }
     
     

+ 48 - 36
csharp/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs

@@ -58,46 +58,34 @@ namespace Google.ProtocolBuffers.TestProtos {
     #region Static variables
     #region Static variables
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSet__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSet__Descriptor 
         = Descriptor.MessageTypes[0];
         = Descriptor.MessageTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSet__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSet),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSet.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSet, global::Google.ProtocolBuffers.TestProtos.TestMessageSet.Builder> internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSet, global::Google.ProtocolBuffers.TestProtos.TestMessageSet.Builder>(internal__static_protobuf_unittest_TestMessageSet__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor 
         = Descriptor.MessageTypes[1];
         = Descriptor.MessageTypes[1];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor,
-            new string[] { "MessageSet", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer, global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer.Builder> internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer, global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer.Builder>(internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor,
+            new string[] { "MessageSet", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor 
         = Descriptor.MessageTypes[2];
         = Descriptor.MessageTypes[2];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor,
-            new string[] { "I", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1, global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1.Builder> internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1, global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1.Builder>(internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor,
+            new string[] { "I", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor 
         = Descriptor.MessageTypes[3];
         = Descriptor.MessageTypes[3];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor,
-            new string[] { "Str", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2, global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2.Builder> internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2, global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2.Builder>(internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor,
+            new string[] { "Str", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RawMessageSet__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RawMessageSet__Descriptor 
         = Descriptor.MessageTypes[4];
         = Descriptor.MessageTypes[4];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RawMessageSet__Descriptor,
-            new string[] { "Item", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.RawMessageSet),
-            typeof (global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RawMessageSet, global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Builder> internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RawMessageSet, global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Builder>(internal__static_protobuf_unittest_RawMessageSet__Descriptor,
+            new string[] { "Item", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor 
         = internal__static_protobuf_unittest_RawMessageSet__Descriptor.NestedTypes[0];
         = internal__static_protobuf_unittest_RawMessageSet__Descriptor.NestedTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor,
-            new string[] { "TypeId", "Message", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item),
-            typeof (global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item, global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item.Builder> internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item, global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item.Builder>(internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor,
+            new string[] { "TypeId", "Message", });
     #endregion
     #endregion
     
     
   }
   }
@@ -116,11 +104,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestMessageSet ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestMessageSet, TestMessageSet.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSet__FieldAccessorTable; }
     }
     }
     
     
@@ -281,11 +273,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestMessageSetContainer ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestMessageSetContainer, TestMessageSetContainer.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetContainer__FieldAccessorTable; }
     }
     }
     
     
@@ -508,11 +504,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestMessageSetExtension1 ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestMessageSetExtension1, TestMessageSetExtension1.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension1__FieldAccessorTable; }
     }
     }
     
     
@@ -718,11 +718,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestMessageSetExtension2 ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestMessageSetExtension2, TestMessageSetExtension2.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_TestMessageSetExtension2__FieldAccessorTable; }
     }
     }
     
     
@@ -928,11 +932,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override RawMessageSet ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<RawMessageSet, RawMessageSet.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet__FieldAccessorTable; }
     }
     }
     
     
@@ -948,11 +956,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override Item ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<Item, Item.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestMessageSetProtoFile.internal__static_protobuf_unittest_RawMessageSet_Item__FieldAccessorTable; }
         }
         }
         
         

+ 8 - 6
csharp/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs

@@ -42,11 +42,9 @@ namespace Google.ProtocolBuffers.TestProtos {
     #region Static variables
     #region Static variables
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor 
         = Descriptor.MessageTypes[0];
         = Descriptor.MessageTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor,
-            new string[] { "I", "Msg", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize, global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder> internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize, global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.Builder>(internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor,
+            new string[] { "I", "Msg", });
     #endregion
     #endregion
     
     
   }
   }
@@ -65,11 +63,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestOptimizedForSize ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestOptimizedForSize, TestOptimizedForSize.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestOptimizeForProtoFile.internal__static_protobuf_unittest_TestOptimizedForSize__FieldAccessorTable; }
     }
     }
     
     

+ 232 - 174
csharp/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs

@@ -799,207 +799,149 @@ namespace Google.ProtocolBuffers.TestProtos {
     #region Static variables
     #region Static variables
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllTypes__Descriptor 
         = Descriptor.MessageTypes[0];
         = Descriptor.MessageTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes__Descriptor,
-            new string[] { "OptionalInt32", "OptionalInt64", "OptionalUint32", "OptionalUint64", "OptionalSint32", "OptionalSint64", "OptionalFixed32", "OptionalFixed64", "OptionalSfixed32", "OptionalSfixed64", "OptionalFloat", "OptionalDouble", "OptionalBool", "OptionalString", "OptionalBytes", "OptionalGroup", "OptionalNestedMessage", "OptionalForeignMessage", "OptionalImportMessage", "OptionalNestedEnum", "OptionalForeignEnum", "OptionalImportEnum", "OptionalStringPiece", "OptionalCord", "RepeatedInt32", "RepeatedInt64", "RepeatedUint32", "RepeatedUint64", "RepeatedSint32", "RepeatedSint64", "RepeatedFixed32", "RepeatedFixed64", "RepeatedSfixed32", "RepeatedSfixed64", "RepeatedFloat", "RepeatedDouble", "RepeatedBool", "RepeatedString", "RepeatedBytes", "RepeatedGroup", "RepeatedNestedMessage", "RepeatedForeignMessage", "RepeatedImportMessage", "RepeatedNestedEnum", "RepeatedForeignEnum", "RepeatedImportEnum", "RepeatedStringPiece", "RepeatedCord", "DefaultInt32", "DefaultInt64", "DefaultUint32", "DefaultUint64", "DefaultSint32", "DefaultSint64", "DefaultFixed32", "DefaultFixed64", "DefaultSfixed32", "DefaultSfixed64", "DefaultFloat", "DefaultDouble", "DefaultBool", "DefaultString", "DefaultBytes", "DefaultNestedEnum", "DefaultForeignEnum", "DefaultImportEnum", "DefaultStringPiece", "DefaultCord", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder> internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Builder>(internal__static_protobuf_unittest_TestAllTypes__Descriptor,
+            new string[] { "OptionalInt32", "OptionalInt64", "OptionalUint32", "OptionalUint64", "OptionalSint32", "OptionalSint64", "OptionalFixed32", "OptionalFixed64", "OptionalSfixed32", "OptionalSfixed64", "OptionalFloat", "OptionalDouble", "OptionalBool", "OptionalString", "OptionalBytes", "OptionalGroup", "OptionalNestedMessage", "OptionalForeignMessage", "OptionalImportMessage", "OptionalNestedEnum", "OptionalForeignEnum", "OptionalImportEnum", "OptionalStringPiece", "OptionalCord", "RepeatedInt32", "RepeatedInt64", "RepeatedUint32", "RepeatedUint64", "RepeatedSint32", "RepeatedSint64", "RepeatedFixed32", "RepeatedFixed64", "RepeatedSfixed32", "RepeatedSfixed64", "RepeatedFloat", "RepeatedDouble", "RepeatedBool", "RepeatedString", "RepeatedBytes", "RepeatedGroup", "RepeatedNestedMessage", "RepeatedForeignMessage", "RepeatedImportMessage", "RepeatedNestedEnum", "RepeatedForeignEnum", "RepeatedImportEnum", "RepeatedStringPiece", "RepeatedCord", "DefaultInt32", "DefaultInt64", "DefaultUint32", "DefaultUint64", "DefaultSint32", "DefaultSint64", "DefaultFixed32", "DefaultFixed64", "DefaultSfixed32", "DefaultSfixed64", "DefaultFloat", "DefaultDouble", "DefaultBool", "DefaultString", "DefaultBytes", "DefaultNestedEnum", "DefaultForeignEnum", "DefaultImportEnum", "DefaultStringPiece", "DefaultCord", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor 
         = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[0];
         = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor,
-            new string[] { "Bb", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor,
+            new string[] { "Bb", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor 
         = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[1];
         = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[1];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor,
-            new string[] { "A", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder> internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.Builder>(internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor,
+            new string[] { "A", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor 
         = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[2];
         = internal__static_protobuf_unittest_TestAllTypes__Descriptor.NestedTypes[2];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor,
-            new string[] { "A", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder> internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup, global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.Builder>(internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor,
+            new string[] { "A", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_ForeignMessage__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_ForeignMessage__Descriptor 
         = Descriptor.MessageTypes[1];
         = Descriptor.MessageTypes[1];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_ForeignMessage__Descriptor,
-            new string[] { "C", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.ForeignMessage),
-            typeof (global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder> internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.ForeignMessage, global::Google.ProtocolBuffers.TestProtos.ForeignMessage.Builder>(internal__static_protobuf_unittest_ForeignMessage__Descriptor,
+            new string[] { "C", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllExtensions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestAllExtensions__Descriptor 
         = Descriptor.MessageTypes[2];
         = Descriptor.MessageTypes[2];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestAllExtensions__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllExtensions),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllExtensions, global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Builder> internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestAllExtensions, global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.Builder>(internal__static_protobuf_unittest_TestAllExtensions__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor 
         = Descriptor.MessageTypes[3];
         = Descriptor.MessageTypes[3];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor,
-            new string[] { "A", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension),
-            typeof (global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension, global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Builder> internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension, global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.Builder>(internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor,
+            new string[] { "A", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor 
         = Descriptor.MessageTypes[4];
         = Descriptor.MessageTypes[4];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor,
-            new string[] { "A", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension),
-            typeof (global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension, global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Builder> internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension, global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.Builder>(internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor,
+            new string[] { "A", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequired__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequired__Descriptor 
         = Descriptor.MessageTypes[5];
         = Descriptor.MessageTypes[5];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRequired__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRequired__Descriptor,
-            new string[] { "A", "Dummy2", "B", "Dummy4", "Dummy5", "Dummy6", "Dummy7", "Dummy8", "Dummy9", "Dummy10", "Dummy11", "Dummy12", "Dummy13", "Dummy14", "Dummy15", "Dummy16", "Dummy17", "Dummy18", "Dummy19", "Dummy20", "Dummy21", "Dummy22", "Dummy23", "Dummy24", "Dummy25", "Dummy26", "Dummy27", "Dummy28", "Dummy29", "Dummy30", "Dummy31", "Dummy32", "C", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestRequired),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequired, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder> internal__static_protobuf_unittest_TestRequired__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequired, global::Google.ProtocolBuffers.TestProtos.TestRequired.Builder>(internal__static_protobuf_unittest_TestRequired__Descriptor,
+            new string[] { "A", "Dummy2", "B", "Dummy4", "Dummy5", "Dummy6", "Dummy7", "Dummy8", "Dummy9", "Dummy10", "Dummy11", "Dummy12", "Dummy13", "Dummy14", "Dummy15", "Dummy16", "Dummy17", "Dummy18", "Dummy19", "Dummy20", "Dummy21", "Dummy22", "Dummy23", "Dummy24", "Dummy25", "Dummy26", "Dummy27", "Dummy28", "Dummy29", "Dummy30", "Dummy31", "Dummy32", "C", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredForeign__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRequiredForeign__Descriptor 
         = Descriptor.MessageTypes[6];
         = Descriptor.MessageTypes[6];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRequiredForeign__Descriptor,
-            new string[] { "OptionalMessage", "RepeatedMessage", "Dummy", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign, global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Builder> internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign, global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.Builder>(internal__static_protobuf_unittest_TestRequiredForeign__Descriptor,
+            new string[] { "OptionalMessage", "RepeatedMessage", "Dummy", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestForeignNested__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestForeignNested__Descriptor 
         = Descriptor.MessageTypes[7];
         = Descriptor.MessageTypes[7];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestForeignNested__Descriptor,
-            new string[] { "ForeignNested", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestForeignNested),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestForeignNested, global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Builder> internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestForeignNested, global::Google.ProtocolBuffers.TestProtos.TestForeignNested.Builder>(internal__static_protobuf_unittest_TestForeignNested__Descriptor,
+            new string[] { "ForeignNested", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessage__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessage__Descriptor 
         = Descriptor.MessageTypes[8];
         = Descriptor.MessageTypes[8];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmptyMessage__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Builder> internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.Builder>(internal__static_protobuf_unittest_TestEmptyMessage__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor 
         = Descriptor.MessageTypes[9];
         = Descriptor.MessageTypes[9];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Builder> internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions, global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.Builder>(internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor 
         = Descriptor.MessageTypes[10];
         = Descriptor.MessageTypes[10];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor,
-            new string[] { "A", "Bb", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber, global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Builder> internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber, global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.Builder>(internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor,
+            new string[] { "A", "Bb", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor 
         = Descriptor.MessageTypes[11];
         = Descriptor.MessageTypes[11];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor,
-            new string[] { "A", "I", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage, global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder> internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage, global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.Builder>(internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor,
+            new string[] { "A", "I", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor 
         = Descriptor.MessageTypes[12];
         = Descriptor.MessageTypes[12];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor,
-            new string[] { "Bb", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder> internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.Builder>(internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor,
+            new string[] { "Bb", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor 
         = Descriptor.MessageTypes[13];
         = Descriptor.MessageTypes[13];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor,
-            new string[] { "A", "OptionalInt32", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder> internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB, global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.Builder>(internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor,
+            new string[] { "A", "OptionalInt32", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor 
         = Descriptor.MessageTypes[14];
         = Descriptor.MessageTypes[14];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor,
-            new string[] { "A", "Foo", "Bar", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Builder> internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor,
+            new string[] { "A", "Foo", "Bar", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor 
         = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[0];
         = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor,
-            new string[] { "A", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder> internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor,
+            new string[] { "A", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor 
         = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[1];
         = internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor.NestedTypes[1];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor,
-            new string[] { "A", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder> internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar, global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.Builder>(internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor,
+            new string[] { "A", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor 
         = Descriptor.MessageTypes[15];
         = Descriptor.MessageTypes[15];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor,
-            new string[] { "OptionalNestedMessage", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Builder> internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Builder>(internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor,
+            new string[] { "OptionalNestedMessage", });
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor 
         = internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor.NestedTypes[0];
         = internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor.NestedTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor,
-            new string[] { "NestedmessageRepeatedInt32", "NestedmessageRepeatedForeignmessage", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder> internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage, global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.Builder>(internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor,
+            new string[] { "NestedmessageRepeatedInt32", "NestedmessageRepeatedForeignmessage", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor 
         = Descriptor.MessageTypes[16];
         = Descriptor.MessageTypes[16];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor,
-            new string[] { "PrimitiveField", "StringField", "EnumField", "MessageField", "StringPieceField", "CordField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedStringPieceField", "RepeatedCordField", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames, global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Builder> internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames, global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.Builder>(internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor,
+            new string[] { "PrimitiveField", "StringField", "EnumField", "MessageField", "StringPieceField", "CordField", "RepeatedPrimitiveField", "RepeatedStringField", "RepeatedEnumField", "RepeatedMessageField", "RepeatedStringPieceField", "RepeatedCordField", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestFieldOrderings__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestFieldOrderings__Descriptor 
         = Descriptor.MessageTypes[17];
         = Descriptor.MessageTypes[17];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestFieldOrderings__Descriptor,
-            new string[] { "MyString", "MyInt", "MyFloat", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Builder> internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings, global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.Builder>(internal__static_protobuf_unittest_TestFieldOrderings__Descriptor,
+            new string[] { "MyString", "MyInt", "MyFloat", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor 
         = Descriptor.MessageTypes[18];
         = Descriptor.MessageTypes[18];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor,
-            new string[] { "EscapedBytes", "LargeUint32", "LargeUint64", "SmallInt32", "SmallInt64", "Utf8String", },
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues),
-            typeof (global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues, global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Builder> internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues, global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.Builder>(internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor,
+            new string[] { "EscapedBytes", "LargeUint32", "LargeUint64", "SmallInt32", "SmallInt64", "Utf8String", });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooRequest__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooRequest__Descriptor 
         = Descriptor.MessageTypes[19];
         = Descriptor.MessageTypes[19];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_FooRequest__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_FooRequest__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.FooRequest),
-            typeof (global::Google.ProtocolBuffers.TestProtos.FooRequest.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooRequest, global::Google.ProtocolBuffers.TestProtos.FooRequest.Builder> internal__static_protobuf_unittest_FooRequest__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooRequest, global::Google.ProtocolBuffers.TestProtos.FooRequest.Builder>(internal__static_protobuf_unittest_FooRequest__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooResponse__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_FooResponse__Descriptor 
         = Descriptor.MessageTypes[20];
         = Descriptor.MessageTypes[20];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_FooResponse__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_FooResponse__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.FooResponse),
-            typeof (global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder> internal__static_protobuf_unittest_FooResponse__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.FooResponse, global::Google.ProtocolBuffers.TestProtos.FooResponse.Builder>(internal__static_protobuf_unittest_FooResponse__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarRequest__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarRequest__Descriptor 
         = Descriptor.MessageTypes[21];
         = Descriptor.MessageTypes[21];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_BarRequest__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_BarRequest__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.BarRequest),
-            typeof (global::Google.ProtocolBuffers.TestProtos.BarRequest.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarRequest, global::Google.ProtocolBuffers.TestProtos.BarRequest.Builder> internal__static_protobuf_unittest_BarRequest__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarRequest, global::Google.ProtocolBuffers.TestProtos.BarRequest.Builder>(internal__static_protobuf_unittest_BarRequest__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarResponse__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_protobuf_unittest_BarResponse__Descriptor 
         = Descriptor.MessageTypes[22];
         = Descriptor.MessageTypes[22];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_protobuf_unittest_BarResponse__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_protobuf_unittest_BarResponse__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.TestProtos.BarResponse),
-            typeof (global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder> internal__static_protobuf_unittest_BarResponse__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.BarResponse, global::Google.ProtocolBuffers.TestProtos.BarResponse.Builder>(internal__static_protobuf_unittest_BarResponse__Descriptor,
+            new string[] { });
     #endregion
     #endregion
     
     
   }
   }
@@ -1040,11 +982,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestAllTypes ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestAllTypes, TestAllTypes.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes__FieldAccessorTable; }
     }
     }
     
     
@@ -1066,11 +1012,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_NestedMessage__FieldAccessorTable; }
         }
         }
         
         
@@ -1269,11 +1219,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override OptionalGroup ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<OptionalGroup, OptionalGroup.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_OptionalGroup__FieldAccessorTable; }
         }
         }
         
         
@@ -1472,11 +1426,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override RepeatedGroup ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<RepeatedGroup, RepeatedGroup.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllTypes_RepeatedGroup__FieldAccessorTable; }
         }
         }
         
         
@@ -5363,11 +5321,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override ForeignMessage ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<ForeignMessage, ForeignMessage.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_ForeignMessage__FieldAccessorTable; }
     }
     }
     
     
@@ -5566,11 +5528,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestAllExtensions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestAllExtensions, TestAllExtensions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestAllExtensions__FieldAccessorTable; }
     }
     }
     
     
@@ -5731,11 +5697,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override OptionalGroup_extension ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<OptionalGroup_extension, OptionalGroup_extension.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_OptionalGroup_extension__FieldAccessorTable; }
     }
     }
     
     
@@ -5934,11 +5904,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override RepeatedGroup_extension ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<RepeatedGroup_extension, RepeatedGroup_extension.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_RepeatedGroup_extension__FieldAccessorTable; }
     }
     }
     
     
@@ -6137,11 +6111,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestRequired ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestRequired, TestRequired.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequired__FieldAccessorTable; }
     }
     }
     
     
@@ -7697,11 +7675,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestRequiredForeign ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestRequiredForeign, TestRequiredForeign.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRequiredForeign__FieldAccessorTable; }
     }
     }
     
     
@@ -8046,11 +8028,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestForeignNested ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestForeignNested, TestForeignNested.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestForeignNested__FieldAccessorTable; }
     }
     }
     
     
@@ -8270,11 +8256,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestEmptyMessage ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestEmptyMessage, TestEmptyMessage.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessage__FieldAccessorTable; }
     }
     }
     
     
@@ -8431,11 +8421,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestEmptyMessageWithExtensions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestEmptyMessageWithExtensions, TestEmptyMessageWithExtensions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestEmptyMessageWithExtensions__FieldAccessorTable; }
     }
     }
     
     
@@ -8596,11 +8590,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestReallyLargeTagNumber ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestReallyLargeTagNumber, TestReallyLargeTagNumber.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestReallyLargeTagNumber__FieldAccessorTable; }
     }
     }
     
     
@@ -8841,11 +8839,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestRecursiveMessage ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestRecursiveMessage, TestRecursiveMessage.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestRecursiveMessage__FieldAccessorTable; }
     }
     }
     
     
@@ -9107,11 +9109,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestMutualRecursionA ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestMutualRecursionA, TestMutualRecursionA.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionA__FieldAccessorTable; }
     }
     }
     
     
@@ -9331,11 +9337,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestMutualRecursionB ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestMutualRecursionB, TestMutualRecursionB.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestMutualRecursionB__FieldAccessorTable; }
     }
     }
     
     
@@ -9597,11 +9607,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestDupFieldNumber ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestDupFieldNumber, TestDupFieldNumber.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber__FieldAccessorTable; }
     }
     }
     
     
@@ -9617,11 +9631,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override Foo ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<Foo, Foo.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Foo__FieldAccessorTable; }
         }
         }
         
         
@@ -9820,11 +9838,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override Bar ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<Bar, Bar.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestDupFieldNumber_Bar__FieldAccessorTable; }
         }
         }
         
         
@@ -10337,11 +10359,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestNestedMessageHasBits ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestNestedMessageHasBits, TestNestedMessageHasBits.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits__FieldAccessorTable; }
     }
     }
     
     
@@ -10357,11 +10383,15 @@ namespace Google.ProtocolBuffers.TestProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override NestedMessage ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<NestedMessage, NestedMessage.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestNestedMessageHasBits_NestedMessage__FieldAccessorTable; }
         }
         }
         
         
@@ -10867,11 +10897,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestCamelCaseFieldNames ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestCamelCaseFieldNames, TestCamelCaseFieldNames.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestCamelCaseFieldNames__FieldAccessorTable; }
     }
     }
     
     
@@ -11703,11 +11737,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestFieldOrderings ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestFieldOrderings, TestFieldOrderings.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestFieldOrderings__FieldAccessorTable; }
     }
     }
     
     
@@ -11995,11 +12033,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override TestExtremeDefaultValues ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<TestExtremeDefaultValues, TestExtremeDefaultValues.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_TestExtremeDefaultValues__FieldAccessorTable; }
     }
     }
     
     
@@ -12408,11 +12450,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override FooRequest ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<FooRequest, FooRequest.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooRequest__FieldAccessorTable; }
     }
     }
     
     
@@ -12569,11 +12615,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override FooResponse ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<FooResponse, FooResponse.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_FooResponse__FieldAccessorTable; }
     }
     }
     
     
@@ -12730,11 +12780,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override BarRequest ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<BarRequest, BarRequest.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarRequest__FieldAccessorTable; }
     }
     }
     
     
@@ -12891,11 +12945,15 @@ namespace Google.ProtocolBuffers.TestProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override BarResponse ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__Descriptor; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<BarResponse, BarResponse.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.TestProtos.UnitTestProtoFile.internal__static_protobuf_unittest_BarResponse__FieldAccessorTable; }
     }
     }
     
     

+ 120 - 90
csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs

@@ -164,109 +164,79 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
     #region Static variables
     #region Static variables
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FileDescriptorProto__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FileDescriptorProto__Descriptor 
         = Descriptor.MessageTypes[0];
         = Descriptor.MessageTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_FileDescriptorProto__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_FileDescriptorProto__Descriptor,
-            new string[] { "Name", "Package", "Dependency", "MessageType", "EnumType", "Service", "Extension", "Options", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.Builder> internal__static_google_protobuf_FileDescriptorProto__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.Builder>(internal__static_google_protobuf_FileDescriptorProto__Descriptor,
+            new string[] { "Name", "Package", "Dependency", "MessageType", "EnumType", "Service", "Extension", "Options", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_DescriptorProto__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_DescriptorProto__Descriptor 
         = Descriptor.MessageTypes[1];
         = Descriptor.MessageTypes[1];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_DescriptorProto__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_DescriptorProto__Descriptor,
-            new string[] { "Name", "Field", "Extension", "NestedType", "EnumType", "ExtensionRange", "Options", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Builder> internal__static_google_protobuf_DescriptorProto__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Builder>(internal__static_google_protobuf_DescriptorProto__Descriptor,
+            new string[] { "Name", "Field", "Extension", "NestedType", "EnumType", "ExtensionRange", "Options", });
     internal static readonly pbd::MessageDescriptor  internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor 
     internal static readonly pbd::MessageDescriptor  internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor 
         = internal__static_google_protobuf_DescriptorProto__Descriptor.NestedTypes[0];
         = internal__static_google_protobuf_DescriptorProto__Descriptor.NestedTypes[0];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_DescriptorProto_ExtensionRange__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor,
-            new string[] { "Start", "End", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange, global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange.Builder> internal__static_google_protobuf_DescriptorProto_ExtensionRange__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange, global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange.Builder>(internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor,
+            new string[] { "Start", "End", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FieldDescriptorProto__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FieldDescriptorProto__Descriptor 
         = Descriptor.MessageTypes[2];
         = Descriptor.MessageTypes[2];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_FieldDescriptorProto__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_FieldDescriptorProto__Descriptor,
-            new string[] { "Name", "Number", "Label", "Type", "TypeName", "Extendee", "DefaultValue", "Options", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.Builder> internal__static_google_protobuf_FieldDescriptorProto__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.Builder>(internal__static_google_protobuf_FieldDescriptorProto__Descriptor,
+            new string[] { "Name", "Number", "Label", "Type", "TypeName", "Extendee", "DefaultValue", "Options", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumDescriptorProto__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumDescriptorProto__Descriptor 
         = Descriptor.MessageTypes[3];
         = Descriptor.MessageTypes[3];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_EnumDescriptorProto__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_EnumDescriptorProto__Descriptor,
-            new string[] { "Name", "Value", "Options", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto.Builder> internal__static_google_protobuf_EnumDescriptorProto__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto.Builder>(internal__static_google_protobuf_EnumDescriptorProto__Descriptor,
+            new string[] { "Name", "Value", "Options", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor 
         = Descriptor.MessageTypes[4];
         = Descriptor.MessageTypes[4];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_EnumValueDescriptorProto__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor,
-            new string[] { "Name", "Number", "Options", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto.Builder> internal__static_google_protobuf_EnumValueDescriptorProto__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto.Builder>(internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor,
+            new string[] { "Name", "Number", "Options", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_ServiceDescriptorProto__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_ServiceDescriptorProto__Descriptor 
         = Descriptor.MessageTypes[5];
         = Descriptor.MessageTypes[5];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_ServiceDescriptorProto__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_ServiceDescriptorProto__Descriptor,
-            new string[] { "Name", "Method", "Options", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto.Builder> internal__static_google_protobuf_ServiceDescriptorProto__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto.Builder>(internal__static_google_protobuf_ServiceDescriptorProto__Descriptor,
+            new string[] { "Name", "Method", "Options", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_MethodDescriptorProto__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_MethodDescriptorProto__Descriptor 
         = Descriptor.MessageTypes[6];
         = Descriptor.MessageTypes[6];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_MethodDescriptorProto__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_MethodDescriptorProto__Descriptor,
-            new string[] { "Name", "InputType", "OutputType", "Options", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto.Builder> internal__static_google_protobuf_MethodDescriptorProto__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto, global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto.Builder>(internal__static_google_protobuf_MethodDescriptorProto__Descriptor,
+            new string[] { "Name", "InputType", "OutputType", "Options", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FileOptions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FileOptions__Descriptor 
         = Descriptor.MessageTypes[7];
         = Descriptor.MessageTypes[7];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_FileOptions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_FileOptions__Descriptor,
-            new string[] { "JavaPackage", "JavaOuterClassname", "JavaMultipleFiles", "OptimizeFor", "CsharpNamespace", "CsharpFileClassname", "CsharpMultipleFiles", "CsharpNestClasses", "CsharpPublicClasses", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FileOptions),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FileOptions, global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.Builder> internal__static_google_protobuf_FileOptions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FileOptions, global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.Builder>(internal__static_google_protobuf_FileOptions__Descriptor,
+            new string[] { "JavaPackage", "JavaOuterClassname", "JavaMultipleFiles", "OptimizeFor", "CsharpNamespace", "CsharpFileClassname", "CsharpMultipleFiles", "CsharpNestClasses", "CsharpPublicClasses", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_MessageOptions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_MessageOptions__Descriptor 
         = Descriptor.MessageTypes[8];
         = Descriptor.MessageTypes[8];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_MessageOptions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_MessageOptions__Descriptor,
-            new string[] { "MessageSetWireFormat", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions, global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions.Builder> internal__static_google_protobuf_MessageOptions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions, global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions.Builder>(internal__static_google_protobuf_MessageOptions__Descriptor,
+            new string[] { "MessageSetWireFormat", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FieldOptions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FieldOptions__Descriptor 
         = Descriptor.MessageTypes[9];
         = Descriptor.MessageTypes[9];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_FieldOptions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_FieldOptions__Descriptor,
-            new string[] { "Ctype", "ExperimentalMapKey", },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions, global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.Builder> internal__static_google_protobuf_FieldOptions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions, global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.Builder>(internal__static_google_protobuf_FieldOptions__Descriptor,
+            new string[] { "Ctype", "ExperimentalMapKey", });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumOptions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumOptions__Descriptor 
         = Descriptor.MessageTypes[10];
         = Descriptor.MessageTypes[10];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_EnumOptions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_EnumOptions__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions, global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions.Builder> internal__static_google_protobuf_EnumOptions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions, global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions.Builder>(internal__static_google_protobuf_EnumOptions__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumValueOptions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_EnumValueOptions__Descriptor 
         = Descriptor.MessageTypes[11];
         = Descriptor.MessageTypes[11];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_EnumValueOptions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_EnumValueOptions__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions, global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions.Builder> internal__static_google_protobuf_EnumValueOptions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions, global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions.Builder>(internal__static_google_protobuf_EnumValueOptions__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_ServiceOptions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_ServiceOptions__Descriptor 
         = Descriptor.MessageTypes[12];
         = Descriptor.MessageTypes[12];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_ServiceOptions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_ServiceOptions__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions, global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions.Builder> internal__static_google_protobuf_ServiceOptions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions, global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions.Builder>(internal__static_google_protobuf_ServiceOptions__Descriptor,
+            new string[] { });
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_MethodOptions__Descriptor 
     internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_MethodOptions__Descriptor 
         = Descriptor.MessageTypes[13];
         = Descriptor.MessageTypes[13];
-    internal static pb::FieldAccess.FieldAccessorTable internal__static_google_protobuf_MethodOptions__FieldAccessorTable
-        = new pb::FieldAccess.FieldAccessorTable(internal__static_google_protobuf_MethodOptions__Descriptor,
-            new string[] { },
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions),
-            typeof (global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions.Builder));
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions, global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions.Builder> internal__static_google_protobuf_MethodOptions__FieldAccessorTable
+        = new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions, global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions.Builder>(internal__static_google_protobuf_MethodOptions__Descriptor,
+            new string[] { });
     #endregion
     #endregion
     
     
   }
   }
@@ -285,11 +255,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override FileDescriptorProto ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<FileDescriptorProto, FileDescriptorProto.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileDescriptorProto__FieldAccessorTable; }
     }
     }
     
     
@@ -964,11 +938,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override DescriptorProto ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<DescriptorProto, DescriptorProto.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto__FieldAccessorTable; }
     }
     }
     
     
@@ -984,11 +962,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
           get { return defaultInstance; }
           get { return defaultInstance; }
         }
         }
         
         
+        protected override ExtensionRange ThisMessage {
+          get { return this; }
+        }
+        
         public static pbd::MessageDescriptor Descriptor {
         public static pbd::MessageDescriptor Descriptor {
           get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor; }
           get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__Descriptor; }
         }
         }
         
         
-        protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+        protected override pb::FieldAccess.FieldAccessorTable<ExtensionRange, ExtensionRange.Builder> InternalFieldAccessors {
           get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__FieldAccessorTable; }
           get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_DescriptorProto_ExtensionRange__FieldAccessorTable; }
         }
         }
         
         
@@ -1865,11 +1847,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override FieldDescriptorProto ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<FieldDescriptorProto, FieldDescriptorProto.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldDescriptorProto__FieldAccessorTable; }
     }
     }
     
     
@@ -2423,11 +2409,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override EnumDescriptorProto ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<EnumDescriptorProto, EnumDescriptorProto.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumDescriptorProto__FieldAccessorTable; }
     }
     }
     
     
@@ -2766,11 +2756,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override EnumValueDescriptorProto ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<EnumValueDescriptorProto, EnumValueDescriptorProto.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueDescriptorProto__FieldAccessorTable; }
     }
     }
     
     
@@ -3074,11 +3068,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override ServiceDescriptorProto ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<ServiceDescriptorProto, ServiceDescriptorProto.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceDescriptorProto__FieldAccessorTable; }
     }
     }
     
     
@@ -3417,11 +3415,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override MethodDescriptorProto ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<MethodDescriptorProto, MethodDescriptorProto.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodDescriptorProto__FieldAccessorTable; }
     }
     }
     
     
@@ -3767,11 +3769,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override FileOptions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileOptions__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileOptions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<FileOptions, FileOptions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileOptions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FileOptions__FieldAccessorTable; }
     }
     }
     
     
@@ -4320,11 +4326,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override MessageOptions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<MessageOptions, MessageOptions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MessageOptions__FieldAccessorTable; }
     }
     }
     
     
@@ -4523,11 +4533,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override FieldOptions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<FieldOptions, FieldOptions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_FieldOptions__FieldAccessorTable; }
     }
     }
     
     
@@ -4782,11 +4796,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override EnumOptions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<EnumOptions, EnumOptions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumOptions__FieldAccessorTable; }
     }
     }
     
     
@@ -4943,11 +4961,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override EnumValueOptions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<EnumValueOptions, EnumValueOptions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_EnumValueOptions__FieldAccessorTable; }
     }
     }
     
     
@@ -5104,11 +5126,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override ServiceOptions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<ServiceOptions, ServiceOptions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_ServiceOptions__FieldAccessorTable; }
     }
     }
     
     
@@ -5265,11 +5291,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       get { return defaultInstance; }
       get { return defaultInstance; }
     }
     }
     
     
+    protected override MethodOptions ThisMessage {
+      get { return this; }
+    }
+    
     public static pbd::MessageDescriptor Descriptor {
     public static pbd::MessageDescriptor Descriptor {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__Descriptor; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__Descriptor; }
     }
     }
     
     
-    protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {
+    protected override pb::FieldAccess.FieldAccessorTable<MethodOptions, MethodOptions.Builder> InternalFieldAccessors {
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__FieldAccessorTable; }
       get { return global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.internal__static_google_protobuf_MethodOptions__FieldAccessorTable; }
     }
     }
     
     

+ 11 - 0
csharp/ProtocolBuffers/FieldAccess/Delegates.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Google.ProtocolBuffers.FieldAccess {
+
+  delegate bool HasDelegate<T>(T message);
+  delegate T ClearDelegate<T>(T builder);
+  delegate int RepeatedCountDelegate<T>(T message);
+  delegate object GetValueDelegate<T>(T message);
+}

+ 15 - 15
csharp/ProtocolBuffers/FieldAccess/FieldAccessorTable.cs

@@ -23,9 +23,11 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// create appropriate instances in the .proto file description class.
   /// create appropriate instances in the .proto file description class.
   /// TODO(jonskeet): See if we can hide it somewhere...
   /// TODO(jonskeet): See if we can hide it somewhere...
   /// </summary>
   /// </summary>
-  public sealed class FieldAccessorTable {
+  public sealed class FieldAccessorTable<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
-    readonly IFieldAccessor[] accessors;
+    readonly IFieldAccessor<TMessage, TBuilder>[] accessors;
 
 
     readonly MessageDescriptor descriptor;
     readonly MessageDescriptor descriptor;
 
 
@@ -39,36 +41,34 @@ namespace Google.ProtocolBuffers.FieldAccess {
     /// </summary>
     /// </summary>
     /// <param name="descriptor">The type's descriptor</param>
     /// <param name="descriptor">The type's descriptor</param>
     /// <param name="propertyNames">The Pascal-case names of all the field-based properties in the message.</param>
     /// <param name="propertyNames">The Pascal-case names of all the field-based properties in the message.</param>
-    /// <param name="messageType">The .NET type representing the message</param>
-    /// <param name="builderType">The .NET type representing the message's builder type</param>
-    public FieldAccessorTable(MessageDescriptor descriptor, String[] propertyNames, Type messageType, Type builderType) {
+    public FieldAccessorTable(MessageDescriptor descriptor, String[] propertyNames) {
       this.descriptor = descriptor;
       this.descriptor = descriptor;
-      accessors = new IFieldAccessor[descriptor.Fields.Count];
+      accessors = new IFieldAccessor<TMessage, TBuilder>[descriptor.Fields.Count];
       for (int i=0; i < accessors.Length; i++) {
       for (int i=0; i < accessors.Length; i++) {
-        accessors[i] = CreateAccessor(descriptor.Fields[i], propertyNames[i], messageType, builderType);
+        accessors[i] = CreateAccessor(descriptor.Fields[i], propertyNames[i]);
       }
       }
     }
     }
 
 
      /// <summary>
      /// <summary>
      /// Creates an accessor for a single field
      /// Creates an accessor for a single field
      /// </summary>   
      /// </summary>   
-    private static IFieldAccessor CreateAccessor(FieldDescriptor field, string name, Type messageType, Type builderType) {
+    private static IFieldAccessor<TMessage, TBuilder> CreateAccessor(FieldDescriptor field, string name) {
       if (field.IsRepeated) {
       if (field.IsRepeated) {
         switch (field.MappedType) {
         switch (field.MappedType) {
-          case MappedType.Message: return new RepeatedMessageAccessor(name, messageType, builderType);
-          case MappedType.Enum: return new RepeatedEnumAccessor(field, name, messageType, builderType);
-          default: return new RepeatedPrimitiveAccessor(name, messageType, builderType);
+          case MappedType.Message: return new RepeatedMessageAccessor<TMessage, TBuilder>(name);
+          case MappedType.Enum: return new RepeatedEnumAccessor<TMessage, TBuilder>(field, name);
+          default: return new RepeatedPrimitiveAccessor<TMessage, TBuilder>(name);
         }
         }
       } else {
       } else {
         switch (field.MappedType) {
         switch (field.MappedType) {
-          case MappedType.Message: return new SingleMessageAccessor(name, messageType, builderType);
-          case MappedType.Enum: return new SingleEnumAccessor(field, name, messageType, builderType);
-          default: return new SinglePrimitiveAccessor(name, messageType, builderType);
+          case MappedType.Message: return new SingleMessageAccessor<TMessage, TBuilder>(name);
+          case MappedType.Enum: return new SingleEnumAccessor<TMessage, TBuilder>(field, name);
+          default: return new SinglePrimitiveAccessor<TMessage, TBuilder>(name);
         }
         }
       }
       }
     }
     }
 
 
-    internal IFieldAccessor this[FieldDescriptor field] {
+    internal IFieldAccessor<TMessage, TBuilder> this[FieldDescriptor field] {
       get {
       get {
         if (field.ContainingType != descriptor) {
         if (field.ContainingType != descriptor) {
           throw new ArgumentException("FieldDescriptor does not match message type.");
           throw new ArgumentException("FieldDescriptor does not match message type.");

+ 8 - 6
csharp/ProtocolBuffers/FieldAccess/IFieldAccessor.cs

@@ -21,23 +21,25 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// The property descriptors for each field are created once and then cached.
   /// The property descriptors for each field are created once and then cached.
   /// In addition, this interface holds knowledge of repeated fields, builders etc.
   /// In addition, this interface holds knowledge of repeated fields, builders etc.
   /// </summary>
   /// </summary>
-  internal interface IFieldAccessor {
+  internal interface IFieldAccessor<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
     /// <summary>
     /// <summary>
     /// Indicates whether the specified message contains the field.
     /// Indicates whether the specified message contains the field.
     /// </summary>
     /// </summary>
-    bool Has(IMessage message);
+    bool Has(TMessage message);
 
 
     /// <summary>
     /// <summary>
     /// Gets the count of the repeated field in the specified message.
     /// Gets the count of the repeated field in the specified message.
     /// </summary>
     /// </summary>
-    int GetRepeatedCount(IMessage message);
+    int GetRepeatedCount(TMessage message);
 
 
     /// <summary>
     /// <summary>
     /// Clears the field in the specified builder.
     /// Clears the field in the specified builder.
     /// </summary>
     /// </summary>
     /// <param name="builder"></param>
     /// <param name="builder"></param>
-    void Clear(IBuilder builder);
+    void Clear(TBuilder builder);
 
 
     /// <summary>
     /// <summary>
     /// Creates a builder for the type of this field (which must be a message field).
     /// Creates a builder for the type of this field (which must be a message field).
@@ -47,11 +49,11 @@ namespace Google.ProtocolBuffers.FieldAccess {
     /// <summary>
     /// <summary>
     /// Accessor for single fields
     /// Accessor for single fields
     /// </summary>
     /// </summary>
-    object GetValue(IMessage message);
+    object GetValue(TMessage message);
     /// <summary>
     /// <summary>
     /// Mutator for single fields
     /// Mutator for single fields
     /// </summary>
     /// </summary>
-    void SetValue(IBuilder builder, object value);
+    void SetValue(TBuilder builder, object value);
 
 
     /// <summary>
     /// <summary>
     /// Accessor for repeated fields
     /// Accessor for repeated fields

+ 5 - 5
csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs

@@ -24,17 +24,17 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// <summary>
   /// <summary>
   /// Accessor for a repeated enum field.
   /// Accessor for a repeated enum field.
   /// </summary>
   /// </summary>
-  internal sealed class RepeatedEnumAccessor : RepeatedPrimitiveAccessor {
+  internal sealed class RepeatedEnumAccessor<TMessage, TBuilder> : RepeatedPrimitiveAccessor<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
     private readonly EnumDescriptor enumDescriptor;
     private readonly EnumDescriptor enumDescriptor;
 
 
-    internal RepeatedEnumAccessor(FieldDescriptor field, string name, Type messageType, Type builderType)
-        : base(name, messageType, builderType) {
-
+    internal RepeatedEnumAccessor(FieldDescriptor field, string name) : base(name) {
       enumDescriptor = field.EnumType;
       enumDescriptor = field.EnumType;
     }
     }
 
 
-    public override object GetValue(IMessage message) {
+    public override object GetValue(TMessage message) {
       List<EnumValueDescriptor> ret = new List<EnumValueDescriptor>();
       List<EnumValueDescriptor> ret = new List<EnumValueDescriptor>();
       foreach (int rawValue in (IEnumerable) base.GetValue(message)) {
       foreach (int rawValue in (IEnumerable) base.GetValue(message)) {
         ret.Add(enumDescriptor.FindValueByNumber(rawValue));
         ret.Add(enumDescriptor.FindValueByNumber(rawValue));

+ 4 - 3
csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs

@@ -24,7 +24,9 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// TODO(jonskeet): Try to extract the commonality between this and SingleMessageAccessor.
   /// TODO(jonskeet): Try to extract the commonality between this and SingleMessageAccessor.
   /// We almost want multiple inheritance...
   /// We almost want multiple inheritance...
   /// </summary>
   /// </summary>
-  internal sealed class RepeatedMessageAccessor : RepeatedPrimitiveAccessor {
+  internal sealed class RepeatedMessageAccessor<TMessage, TBuilder> : RepeatedPrimitiveAccessor<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
     /// <summary>
     /// <summary>
     /// The static method to create a builder for the property type. For example,
     /// The static method to create a builder for the property type. For example,
@@ -33,8 +35,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
     /// </summary>
     /// </summary>
     private readonly MethodInfo createBuilderMethod;
     private readonly MethodInfo createBuilderMethod;
 
 
-    internal RepeatedMessageAccessor(string name, Type messageType, Type builderType)
-        : base(name, messageType, builderType) {
+    internal RepeatedMessageAccessor(string name) : base(name) {
       createBuilderMethod = ClrType.GetMethod("CreateBuilder", new Type[0]);
       createBuilderMethod = ClrType.GetMethod("CreateBuilder", new Type[0]);
       if (createBuilderMethod == null) {
       if (createBuilderMethod == null) {
         throw new ArgumentException("No public static CreateBuilder method declared in " + ClrType.Name);
         throw new ArgumentException("No public static CreateBuilder method declared in " + ClrType.Name);

+ 23 - 18
csharp/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs

@@ -21,12 +21,14 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// <summary>
   /// <summary>
   /// Accesor for a repeated field of type int, ByteString etc.
   /// Accesor for a repeated field of type int, ByteString etc.
   /// </summary>
   /// </summary>
-  internal class RepeatedPrimitiveAccessor : IFieldAccessor {
+  internal class RepeatedPrimitiveAccessor<TMessage, TBuilder> : IFieldAccessor<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
     private readonly PropertyInfo messageProperty;
     private readonly PropertyInfo messageProperty;
     private readonly PropertyInfo builderProperty;
     private readonly PropertyInfo builderProperty;
-    private readonly PropertyInfo countProperty;
-    private readonly MethodInfo clearMethod;
+    private readonly RepeatedCountDelegate<TMessage> countDelegate;
+    private readonly ClearDelegate<TBuilder> clearDelegate;
     private readonly MethodInfo addMethod;
     private readonly MethodInfo addMethod;
     private readonly MethodInfo getElementMethod;
     private readonly MethodInfo getElementMethod;
     private readonly MethodInfo setElementMethod;
     private readonly MethodInfo setElementMethod;
@@ -40,14 +42,14 @@ namespace Google.ProtocolBuffers.FieldAccess {
       get { return getElementMethod.ReturnType; }
       get { return getElementMethod.ReturnType; }
     }
     }
 
 
-    internal RepeatedPrimitiveAccessor(string name, Type messageType, Type builderType) {      
-      messageProperty = messageType.GetProperty(name + "List");
-      builderProperty = builderType.GetProperty(name + "List");
-      countProperty = messageType.GetProperty(name + "Count");
-      clearMethod = builderType.GetMethod("Clear" + name);
-      getElementMethod = messageType.GetMethod("Get" + name, new Type[] { typeof(int) });
-      addMethod = builderType.GetMethod("Add" + name, new Type[] { ClrType });
-      setElementMethod = builderType.GetMethod("Set" + name, new Type[] { typeof(int), ClrType });
+    internal RepeatedPrimitiveAccessor(string name) {      
+      messageProperty = typeof(TMessage).GetProperty(name + "List");
+      builderProperty = typeof(TBuilder).GetProperty(name + "List");
+      PropertyInfo countProperty = typeof(TMessage).GetProperty(name + "Count");
+      MethodInfo clearMethod = typeof(TBuilder).GetMethod("Clear" + name);
+      getElementMethod = typeof(TMessage).GetMethod("Get" + name, new Type[] { typeof(int) });
+      addMethod = typeof(TBuilder).GetMethod("Add" + name, new Type[] { ClrType });
+      setElementMethod = typeof(TBuilder).GetMethod("Set" + name, new Type[] { typeof(int), ClrType });
       if (messageProperty == null 
       if (messageProperty == null 
           || builderProperty == null 
           || builderProperty == null 
           || countProperty == null
           || countProperty == null
@@ -57,9 +59,12 @@ namespace Google.ProtocolBuffers.FieldAccess {
           || setElementMethod == null) {
           || setElementMethod == null) {
         throw new ArgumentException("Not all required properties/methods available");
         throw new ArgumentException("Not all required properties/methods available");
       }
       }
+      clearDelegate = (ClearDelegate<TBuilder>)Delegate.CreateDelegate(typeof(ClearDelegate<TBuilder>), clearMethod);
+      countDelegate = (RepeatedCountDelegate<TMessage>)Delegate.CreateDelegate
+          (typeof(RepeatedCountDelegate<TMessage>), countProperty.GetGetMethod());
     }
     }
 
 
-    public bool Has(IMessage message) {
+    public bool Has(TMessage message) {
       throw new InvalidOperationException();
       throw new InvalidOperationException();
     }
     }
     
     
@@ -67,11 +72,11 @@ namespace Google.ProtocolBuffers.FieldAccess {
       throw new InvalidOperationException();
       throw new InvalidOperationException();
     }
     }
 
 
-    public virtual object GetValue(IMessage message) {
+    public virtual object GetValue(TMessage message) {
       return messageProperty.GetValue(message, null);
       return messageProperty.GetValue(message, null);
     }
     }
 
 
-    public void SetValue(IBuilder builder, object value) {
+    public void SetValue(TBuilder builder, object value) {
       // Add all the elements individually.  This serves two purposes:
       // Add all the elements individually.  This serves two purposes:
       // 1) Verifies that each element has the correct type.
       // 1) Verifies that each element has the correct type.
       // 2) Insures that the caller cannot modify the list later on and
       // 2) Insures that the caller cannot modify the list later on and
@@ -82,12 +87,12 @@ namespace Google.ProtocolBuffers.FieldAccess {
       }
       }
     }
     }
 
 
-    public void Clear(IBuilder builder) {
-      clearMethod.Invoke(builder, null);
+    public void Clear(TBuilder builder) {
+      clearDelegate(builder);
     }
     }
 
 
-    public int GetRepeatedCount(IMessage message) {
-      return (int) countProperty.GetValue(message, null);
+    public int GetRepeatedCount(TMessage message) {
+      return countDelegate(message);
     }
     }
 
 
     public virtual object GetRepeatedValue(IMessage message, int index) {
     public virtual object GetRepeatedValue(IMessage message, int index) {

+ 6 - 5
csharp/ProtocolBuffers/FieldAccess/SingleEnumAccessor.cs

@@ -20,12 +20,13 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// <summary>
   /// <summary>
   /// Accessor for fields representing a non-repeated enum value.
   /// Accessor for fields representing a non-repeated enum value.
   /// </summary>
   /// </summary>
-  internal sealed class SingleEnumAccessor : SinglePrimitiveAccessor {
+  internal sealed class SingleEnumAccessor<TMessage, TBuilder> : SinglePrimitiveAccessor<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
     private readonly EnumDescriptor enumDescriptor;
     private readonly EnumDescriptor enumDescriptor;
 
 
-    internal SingleEnumAccessor(FieldDescriptor field, string name, Type messageType, Type builderType) 
-        : base(name, messageType, builderType) {
+    internal SingleEnumAccessor(FieldDescriptor field, string name) : base(name) {
       enumDescriptor = field.EnumType;
       enumDescriptor = field.EnumType;
     }
     }
 
 
@@ -34,7 +35,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
     /// Note that if an enum has multiple values for the same number, the descriptor
     /// Note that if an enum has multiple values for the same number, the descriptor
     /// for the first value with that number will be returned.
     /// for the first value with that number will be returned.
     /// </summary>
     /// </summary>
-    public override object GetValue(IMessage message) {
+    public override object GetValue(TMessage message) {
       // Note: This relies on the fact that the CLR allows unboxing from an enum to
       // Note: This relies on the fact that the CLR allows unboxing from an enum to
       // its underlying value
       // its underlying value
       int rawValue = (int) base.GetValue(message);
       int rawValue = (int) base.GetValue(message);
@@ -45,7 +46,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
     /// Sets the value as an enum (via an int) in the builder,
     /// Sets the value as an enum (via an int) in the builder,
     /// from an EnumValueDescriptor parameter.
     /// from an EnumValueDescriptor parameter.
     /// </summary>
     /// </summary>
-    public override void SetValue(IBuilder builder, object value) {
+    public override void SetValue(TBuilder builder, object value) {
       EnumValueDescriptor valueDescriptor = (EnumValueDescriptor) value;
       EnumValueDescriptor valueDescriptor = (EnumValueDescriptor) value;
       base.SetValue(builder, valueDescriptor.Number);
       base.SetValue(builder, valueDescriptor.Number);
     }
     }

+ 5 - 4
csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs

@@ -20,7 +20,9 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// <summary>
   /// <summary>
   /// Accessor for fields representing a non-repeated message value.
   /// Accessor for fields representing a non-repeated message value.
   /// </summary>
   /// </summary>
-  internal sealed class SingleMessageAccessor : SinglePrimitiveAccessor {
+  internal sealed class SingleMessageAccessor<TMessage, TBuilder> : SinglePrimitiveAccessor<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
     /// <summary>
     /// <summary>
     /// The static method to create a builder for the property type. For example,
     /// The static method to create a builder for the property type. For example,
@@ -30,8 +32,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
     private readonly MethodInfo createBuilderMethod;
     private readonly MethodInfo createBuilderMethod;
 
 
 
 
-    internal SingleMessageAccessor(string name, Type messageType, Type builderType) 
-        : base(name, messageType, builderType) {
+    internal SingleMessageAccessor(string name) : base(name) {
       
       
       createBuilderMethod = ClrType.GetMethod("CreateBuilder", new Type[0]);//BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
       createBuilderMethod = ClrType.GetMethod("CreateBuilder", new Type[0]);//BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
       if (createBuilderMethod == null) {
       if (createBuilderMethod == null) {
@@ -55,7 +56,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
       return CreateBuilder().WeakMergeFrom(message).WeakBuild();
       return CreateBuilder().WeakMergeFrom(message).WeakBuild();
     }
     }
 
 
-    public override void SetValue(IBuilder builder, object value) {
+    public override void SetValue(TBuilder builder, object value) {
       base.SetValue(builder, CoerceType(value));
       base.SetValue(builder, CoerceType(value));
     }
     }
 
 

+ 19 - 15
csharp/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs

@@ -20,12 +20,14 @@ namespace Google.ProtocolBuffers.FieldAccess {
   /// <summary>
   /// <summary>
   /// Access for a non-repeated field of a "primitive" type (i.e. not another message or an enum).
   /// Access for a non-repeated field of a "primitive" type (i.e. not another message or an enum).
   /// </summary>
   /// </summary>
-  internal class SinglePrimitiveAccessor : IFieldAccessor {
+  internal class SinglePrimitiveAccessor<TMessage, TBuilder> : IFieldAccessor<TMessage, TBuilder>
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder> {
 
 
     private readonly PropertyInfo messageProperty;
     private readonly PropertyInfo messageProperty;
     private readonly PropertyInfo builderProperty;
     private readonly PropertyInfo builderProperty;
-    private readonly PropertyInfo hasProperty;
-    private readonly MethodInfo clearMethod;
+    private readonly HasDelegate<TMessage> hasDelegate;
+    private readonly ClearDelegate<TBuilder> clearDelegate;
 
 
     /// <summary>
     /// <summary>
     /// The CLR type of the field (int, the enum type, ByteString, the message etc).
     /// The CLR type of the field (int, the enum type, ByteString, the message etc).
@@ -35,22 +37,24 @@ namespace Google.ProtocolBuffers.FieldAccess {
       get { return messageProperty.PropertyType; }
       get { return messageProperty.PropertyType; }
     }
     }
 
 
-    internal SinglePrimitiveAccessor(string name, Type messageType, Type builderType) {
-      messageProperty = messageType.GetProperty(name);
-      builderProperty = builderType.GetProperty(name);
-      hasProperty = messageType.GetProperty("Has" + name);
-      clearMethod = builderType.GetMethod("Clear" + name);
+    internal SinglePrimitiveAccessor(string name) {
+      messageProperty = typeof(TMessage).GetProperty(name);
+      builderProperty = typeof(TBuilder).GetProperty(name);
+      PropertyInfo hasProperty = typeof(TMessage).GetProperty("Has" + name);
+      MethodInfo clearMethod = typeof(TBuilder).GetMethod("Clear" + name);
       if (messageProperty == null || builderProperty == null || hasProperty == null || clearMethod == null) {
       if (messageProperty == null || builderProperty == null || hasProperty == null || clearMethod == null) {
         throw new ArgumentException("Not all required properties/methods available");
         throw new ArgumentException("Not all required properties/methods available");
       }
       }
+      hasDelegate = (HasDelegate<TMessage>)Delegate.CreateDelegate(typeof(HasDelegate<TMessage>), hasProperty.GetGetMethod());
+      clearDelegate = (ClearDelegate<TBuilder>)Delegate.CreateDelegate(typeof(ClearDelegate<TBuilder>), clearMethod);
     }
     }
 
 
-    public bool Has(IMessage message) {
-      return (bool) hasProperty.GetValue(message, null);
+    public bool Has(TMessage message) {
+      return hasDelegate(message);
     }
     }
 
 
-    public void Clear(IBuilder builder) {
-      clearMethod.Invoke(builder, null);
+    public void Clear(TBuilder builder) {
+      clearDelegate(builder);
     }
     }
 
 
     /// <summary>
     /// <summary>
@@ -60,16 +64,16 @@ namespace Google.ProtocolBuffers.FieldAccess {
       throw new InvalidOperationException();
       throw new InvalidOperationException();
     }
     }
 
 
-    public virtual object GetValue(IMessage message) {
+    public virtual object GetValue(TMessage message) {
       return messageProperty.GetValue(message, null);
       return messageProperty.GetValue(message, null);
     }
     }
 
 
-    public virtual void SetValue(IBuilder builder, object value) {
+    public virtual void SetValue(TBuilder builder, object value) {
       builderProperty.SetValue(builder, value, null);
       builderProperty.SetValue(builder, value, null);
     }
     }
 
 
     #region Methods only related to repeated values
     #region Methods only related to repeated values
-    public int GetRepeatedCount(IMessage message) {
+    public int GetRepeatedCount(TMessage message) {
       throw new InvalidOperationException();
       throw new InvalidOperationException();
     }
     }
 
 

+ 3 - 3
csharp/ProtocolBuffers/GeneratedBuilder.cs

@@ -34,8 +34,8 @@ namespace Google.ProtocolBuffers {
     /// </summary>
     /// </summary>
     protected abstract TMessage MessageBeingBuilt { get; }
     protected abstract TMessage MessageBeingBuilt { get; }
 
 
-    protected internal FieldAccessorTable InternalFieldAccessors {
-      get { return MessageBeingBuilt.FieldAccesseorsFromBuilder; }
+    protected internal FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors {
+      get { return MessageBeingBuilt.FieldAccessorsFromBuilder; }
     }
     }
 
 
     public override bool IsInitialized {
     public override bool IsInitialized {
@@ -104,7 +104,7 @@ namespace Google.ProtocolBuffers {
     }
     }
 
 
     public override TBuilder ClearField(FieldDescriptor field) {
     public override TBuilder ClearField(FieldDescriptor field) {
-      InternalFieldAccessors[field].Clear(this);
+      InternalFieldAccessors[field].Clear(ThisBuilder);
       return ThisBuilder;
       return ThisBuilder;
     }
     }
 
 

+ 14 - 9
csharp/ProtocolBuffers/GeneratedMessage.cs

@@ -33,11 +33,16 @@ namespace Google.ProtocolBuffers {
 
 
     private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
     private UnknownFieldSet unknownFields = UnknownFieldSet.DefaultInstance;
 
 
-    internal FieldAccessorTable FieldAccesseorsFromBuilder {
+    /// <summary>
+    /// Returns the message as a TMessage.
+    /// </summary>
+    protected abstract TMessage ThisMessage { get; }
+
+    internal FieldAccessorTable<TMessage, TBuilder> FieldAccessorsFromBuilder {
       get { return InternalFieldAccessors; }
       get { return InternalFieldAccessors; }
     }
     }
 
 
-    protected abstract FieldAccessorTable InternalFieldAccessors { get; }
+    protected abstract FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors { get; }
 
 
     public override MessageDescriptor DescriptorForType {
     public override MessageDescriptor DescriptorForType {
       get { return InternalFieldAccessors.Descriptor; }
       get { return InternalFieldAccessors.Descriptor; }
@@ -49,13 +54,13 @@ namespace Google.ProtocolBuffers {
       var ret = new SortedList<FieldDescriptor, object>();
       var ret = new SortedList<FieldDescriptor, object>();
       MessageDescriptor descriptor = DescriptorForType;
       MessageDescriptor descriptor = DescriptorForType;
       foreach (FieldDescriptor field in descriptor.Fields) {
       foreach (FieldDescriptor field in descriptor.Fields) {
-        IFieldAccessor accessor = InternalFieldAccessors[field];
+        IFieldAccessor<TMessage, TBuilder> accessor = InternalFieldAccessors[field];
         if (field.IsRepeated) {
         if (field.IsRepeated) {
-          if (accessor.GetRepeatedCount(this) != 0) {
-            ret[field] = accessor.GetValue(this);
+          if (accessor.GetRepeatedCount(ThisMessage) != 0) {
+            ret[field] = accessor.GetValue(ThisMessage);
           }
           }
         } else if (HasField(field)) {
         } else if (HasField(field)) {
-          ret[field] = accessor.GetValue(this);
+          ret[field] = accessor.GetValue(ThisMessage);
         }
         }
       }
       }
       return ret;
       return ret;
@@ -99,11 +104,11 @@ namespace Google.ProtocolBuffers {
     }
     }
 
 
     public override bool HasField(FieldDescriptor field) {
     public override bool HasField(FieldDescriptor field) {
-      return InternalFieldAccessors[field].Has(this);
+      return InternalFieldAccessors[field].Has(ThisMessage);
     }
     }
 
 
     public override int GetRepeatedFieldCount(FieldDescriptor field) {
     public override int GetRepeatedFieldCount(FieldDescriptor field) {
-      return InternalFieldAccessors[field].GetRepeatedCount(this);
+      return InternalFieldAccessors[field].GetRepeatedCount(ThisMessage);
     }
     }
 
 
     public override object this[FieldDescriptor field, int index] {
     public override object this[FieldDescriptor field, int index] {
@@ -111,7 +116,7 @@ namespace Google.ProtocolBuffers {
     }
     }
 
 
     public override object this[FieldDescriptor field] {
     public override object this[FieldDescriptor field] {
-      get { return InternalFieldAccessors[field].GetValue(this); }
+      get { return InternalFieldAccessors[field].GetValue(ThisMessage); }
     }
     }
 
 
     public override UnknownFieldSet UnknownFields {
     public override UnknownFieldSet UnknownFields {

+ 3 - 0
csharp/ProtocolBuffers/ProtocolBuffers.csproj

@@ -34,6 +34,8 @@
   </PropertyGroup>
   </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <Reference Include="System" />
     <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <Compile Include="AbstractBuilder.cs" />
     <Compile Include="AbstractBuilder.cs" />
@@ -69,6 +71,7 @@
     <Compile Include="ExtendableMessage.cs" />
     <Compile Include="ExtendableMessage.cs" />
     <Compile Include="ExtensionInfo.cs" />
     <Compile Include="ExtensionInfo.cs" />
     <Compile Include="ExtensionRegistry.cs" />
     <Compile Include="ExtensionRegistry.cs" />
+    <Compile Include="FieldAccess\Delegates.cs" />
     <Compile Include="FieldAccess\SingleEnumAccessor.cs" />
     <Compile Include="FieldAccess\SingleEnumAccessor.cs" />
     <Compile Include="FieldAccess\SingleMessageAccessor.cs" />
     <Compile Include="FieldAccess\SingleMessageAccessor.cs" />
     <Compile Include="FieldAccess\SinglePrimitiveAccessor.cs" />
     <Compile Include="FieldAccess\SinglePrimitiveAccessor.cs" />

+ 16 - 10
src/google/protobuf/compiler/csharp/csharp_message.cc

@@ -175,8 +175,8 @@ void MessageGenerator::GenerateStaticVariables(io::Printer* printer) {
 
 
   // And the FieldAccessorTable.
   // And the FieldAccessorTable.
   printer->Print(vars,
   printer->Print(vars,
-    "$private$static pb::FieldAccess.FieldAccessorTable internal__$identifier$__FieldAccessorTable\r\n"
-    "    = new pb::FieldAccess.FieldAccessorTable(internal__$identifier$__Descriptor,\r\n"
+    "$private$static pb::FieldAccess.FieldAccessorTable<$classname$, $classname$.Builder> internal__$identifier$__FieldAccessorTable\r\n"
+    "    = new pb::FieldAccess.FieldAccessorTable<$classname$, $classname$.Builder>(internal__$identifier$__Descriptor,\r\n"
     "        new string[] { ");
     "        new string[] { ");
   for (int i = 0; i < descriptor_->field_count(); i++) {
   for (int i = 0; i < descriptor_->field_count(); i++) {
     printer->Print(
     printer->Print(
@@ -184,10 +184,7 @@ void MessageGenerator::GenerateStaticVariables(io::Printer* printer) {
       "field_name",
       "field_name",
         UnderscoresToCapitalizedCamelCase(descriptor_->field(i)));
         UnderscoresToCapitalizedCamelCase(descriptor_->field(i)));
   }
   }
-  printer->Print("},\r\n"
-    "        typeof ($classname$),\r\n"
-    "        typeof ($classname$.Builder));\r\n",
-    "classname", ClassName(descriptor_));
+  printer->Print("});\r\n");
 
 
   // Generate static members for all nested types.
   // Generate static members for all nested types.
   for (int i = 0; i < descriptor_->nested_type_count(); i++) {
   for (int i = 0; i < descriptor_->nested_type_count(); i++) {
@@ -225,17 +222,26 @@ void MessageGenerator::Generate(io::Printer* printer) {
     "}\r\n"
     "}\r\n"
     "\r\n",
     "\r\n",
     "classname", descriptor_->name());
     "classname", descriptor_->name());
+
   printer->Print(
   printer->Print(
+      "protected override $classname$ ThisMessage {\r\n"
+      "  get { return this; }\r\n"
+      "}\r\n\r\n",
+      "classname", descriptor_->name());
+
+  map<string, string> vars;
+  vars["identifier"] = UniqueFileScopeIdentifier(descriptor_);
+  vars["fileclass"] = ClassName(descriptor_->file());
+  vars["classname"] = descriptor_->name();
+  printer->Print(vars,
     "public static pbd::MessageDescriptor Descriptor {\r\n"
     "public static pbd::MessageDescriptor Descriptor {\r\n"
     "  get { return $fileclass$.internal__$identifier$__Descriptor; }\r\n"
     "  get { return $fileclass$.internal__$identifier$__Descriptor; }\r\n"
     "}\r\n"
     "}\r\n"
     "\r\n"
     "\r\n"
-    "protected override pb::FieldAccess.FieldAccessorTable InternalFieldAccessors {\r\n"
+    "protected override pb::FieldAccess.FieldAccessorTable<$classname$, $classname$.Builder> InternalFieldAccessors {\r\n"
     "  get { return $fileclass$.internal__$identifier$__FieldAccessorTable; }\r\n"
     "  get { return $fileclass$.internal__$identifier$__FieldAccessorTable; }\r\n"
     "}\r\n"
     "}\r\n"
-    "\r\n",
-    "fileclass", ClassName(descriptor_->file()),
-    "identifier", UniqueFileScopeIdentifier(descriptor_));
+    "\r\n");
 
 
   // Extensions don't need to go in an extra nested type
   // Extensions don't need to go in an extra nested type
   for (int i = 0; i < descriptor_->extension_count(); i++) {
   for (int i = 0; i < descriptor_->extension_count(); i++) {