aboutsummaryrefslogtreecommitdiff
path: root/csharp/ProtocolBuffers
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-08-14 20:37:12 +0100
committerJon Skeet <skeet@pobox.com>2008-08-14 20:37:12 +0100
commit272d384f6ad064756edc8d9778c5bcf667783821 (patch)
treeeed1435ff63c89a52e426df79323a9b1c1bef24a /csharp/ProtocolBuffers
parentdb9d2fcd06bd8604f2ff9f30489640f64c70c4cb (diff)
downloadprotobuf-272d384f6ad064756edc8d9778c5bcf667783821.tar.gz
protobuf-272d384f6ad064756edc8d9778c5bcf667783821.tar.bz2
protobuf-272d384f6ad064756edc8d9778c5bcf667783821.zip
Use delegates instead of dynamic reflection.
Diffstat (limited to 'csharp/ProtocolBuffers')
-rw-r--r--csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs210
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/Delegates.cs11
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/FieldAccessorTable.cs30
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/IFieldAccessor.cs14
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs10
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs7
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs41
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/SingleEnumAccessor.cs11
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs9
-rw-r--r--csharp/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs34
-rw-r--r--csharp/ProtocolBuffers/GeneratedBuilder.cs6
-rw-r--r--csharp/ProtocolBuffers/GeneratedMessage.cs23
-rw-r--r--csharp/ProtocolBuffers/ProtocolBuffers.csproj3
13 files changed, 236 insertions, 173 deletions
diff --git a/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs b/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
index ec7bf585..e61f80cf 100644
--- a/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
+++ b/csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs
@@ -164,109 +164,79 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
#region Static variables
internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_FileDescriptorProto__Descriptor
= 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
= 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_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
= 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
= 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
= 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
= 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
= 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
= 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
= 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
= 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
= 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
= 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
= 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
= 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
}
@@ -285,11 +255,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override FileDescriptorProto ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -964,11 +938,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override DescriptorProto ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -984,11 +962,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override ExtensionRange ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -1865,11 +1847,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override FieldDescriptorProto ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -2423,11 +2409,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override EnumDescriptorProto ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -2766,11 +2756,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override EnumValueDescriptorProto ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -3074,11 +3068,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override ServiceDescriptorProto ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -3417,11 +3415,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override MethodDescriptorProto ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -3767,11 +3769,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override FileOptions ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -4320,11 +4326,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override MessageOptions ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -4523,11 +4533,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override FieldOptions ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -4782,11 +4796,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override EnumOptions ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -4943,11 +4961,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override EnumValueOptions ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -5104,11 +5126,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override ServiceOptions ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
@@ -5265,11 +5291,15 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
get { return defaultInstance; }
}
+ protected override MethodOptions ThisMessage {
+ get { return this; }
+ }
+
public static pbd::MessageDescriptor 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; }
}
diff --git a/csharp/ProtocolBuffers/FieldAccess/Delegates.cs b/csharp/ProtocolBuffers/FieldAccess/Delegates.cs
new file mode 100644
index 00000000..04b1d94c
--- /dev/null
+++ b/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);
+}
diff --git a/csharp/ProtocolBuffers/FieldAccess/FieldAccessorTable.cs b/csharp/ProtocolBuffers/FieldAccess/FieldAccessorTable.cs
index 24113b41..c7f5da6d 100644
--- a/csharp/ProtocolBuffers/FieldAccess/FieldAccessorTable.cs
+++ b/csharp/ProtocolBuffers/FieldAccess/FieldAccessorTable.cs
@@ -23,9 +23,11 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// create appropriate instances in the .proto file description class.
/// TODO(jonskeet): See if we can hide it somewhere...
/// </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;
@@ -39,36 +41,34 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// </summary>
/// <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="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;
- accessors = new IFieldAccessor[descriptor.Fields.Count];
+ accessors = new IFieldAccessor<TMessage, TBuilder>[descriptor.Fields.Count];
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>
/// Creates an accessor for a single field
/// </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) {
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 {
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 {
if (field.ContainingType != descriptor) {
throw new ArgumentException("FieldDescriptor does not match message type.");
diff --git a/csharp/ProtocolBuffers/FieldAccess/IFieldAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/IFieldAccessor.cs
index 3e47fdc6..eb57c8c9 100644
--- a/csharp/ProtocolBuffers/FieldAccess/IFieldAccessor.cs
+++ b/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.
/// In addition, this interface holds knowledge of repeated fields, builders etc.
/// </summary>
- internal interface IFieldAccessor {
+ internal interface IFieldAccessor<TMessage, TBuilder>
+ where TMessage : IMessage<TMessage, TBuilder>
+ where TBuilder : IBuilder<TMessage, TBuilder> {
/// <summary>
/// Indicates whether the specified message contains the field.
/// </summary>
- bool Has(IMessage message);
+ bool Has(TMessage message);
/// <summary>
/// Gets the count of the repeated field in the specified message.
/// </summary>
- int GetRepeatedCount(IMessage message);
+ int GetRepeatedCount(TMessage message);
/// <summary>
/// Clears the field in the specified builder.
/// </summary>
/// <param name="builder"></param>
- void Clear(IBuilder builder);
+ void Clear(TBuilder builder);
/// <summary>
/// Creates a builder for the type of this field (which must be a message field).
@@ -47,11 +49,11 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// <summary>
/// Accessor for single fields
/// </summary>
- object GetValue(IMessage message);
+ object GetValue(TMessage message);
/// <summary>
/// Mutator for single fields
/// </summary>
- void SetValue(IBuilder builder, object value);
+ void SetValue(TBuilder builder, object value);
/// <summary>
/// Accessor for repeated fields
diff --git a/csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs
index f6b273ee..3082071b 100644
--- a/csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs
+++ b/csharp/ProtocolBuffers/FieldAccess/RepeatedEnumAccessor.cs
@@ -24,17 +24,17 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// <summary>
/// Accessor for a repeated enum field.
/// </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;
- 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;
}
- public override object GetValue(IMessage message) {
+ public override object GetValue(TMessage message) {
List<EnumValueDescriptor> ret = new List<EnumValueDescriptor>();
foreach (int rawValue in (IEnumerable) base.GetValue(message)) {
ret.Add(enumDescriptor.FindValueByNumber(rawValue));
diff --git a/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs
index d0c53dcc..f350752d 100644
--- a/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs
+++ b/csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs
@@ -24,7 +24,9 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// TODO(jonskeet): Try to extract the commonality between this and SingleMessageAccessor.
/// We almost want multiple inheritance...
/// </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>
/// The static method to create a builder for the property type. For example,
@@ -33,8 +35,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// </summary>
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]);
if (createBuilderMethod == null) {
throw new ArgumentException("No public static CreateBuilder method declared in " + ClrType.Name);
diff --git a/csharp/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs
index ad44991d..39184b1f 100644
--- a/csharp/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs
+++ b/csharp/ProtocolBuffers/FieldAccess/RepeatedPrimitiveAccessor.cs
@@ -21,12 +21,14 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// <summary>
/// Accesor for a repeated field of type int, ByteString etc.
/// </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 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 getElementMethod;
private readonly MethodInfo setElementMethod;
@@ -40,14 +42,14 @@ namespace Google.ProtocolBuffers.FieldAccess {
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
|| builderProperty == null
|| countProperty == null
@@ -57,9 +59,12 @@ namespace Google.ProtocolBuffers.FieldAccess {
|| setElementMethod == null) {
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();
}
@@ -67,11 +72,11 @@ namespace Google.ProtocolBuffers.FieldAccess {
throw new InvalidOperationException();
}
- public virtual object GetValue(IMessage message) {
+ public virtual object GetValue(TMessage message) {
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:
// 1) Verifies that each element has the correct type.
// 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) {
diff --git a/csharp/ProtocolBuffers/FieldAccess/SingleEnumAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/SingleEnumAccessor.cs
index 7db6b182..eb28160a 100644
--- a/csharp/ProtocolBuffers/FieldAccess/SingleEnumAccessor.cs
+++ b/csharp/ProtocolBuffers/FieldAccess/SingleEnumAccessor.cs
@@ -20,12 +20,13 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// <summary>
/// Accessor for fields representing a non-repeated enum value.
/// </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;
- 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;
}
@@ -34,7 +35,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// Note that if an enum has multiple values for the same number, the descriptor
/// for the first value with that number will be returned.
/// </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
// its underlying value
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,
/// from an EnumValueDescriptor parameter.
/// </summary>
- public override void SetValue(IBuilder builder, object value) {
+ public override void SetValue(TBuilder builder, object value) {
EnumValueDescriptor valueDescriptor = (EnumValueDescriptor) value;
base.SetValue(builder, valueDescriptor.Number);
}
diff --git a/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs
index 7945f461..460d450d 100644
--- a/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs
+++ b/csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs
@@ -20,7 +20,9 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// <summary>
/// Accessor for fields representing a non-repeated message value.
/// </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>
/// 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;
- 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);
if (createBuilderMethod == null) {
@@ -55,7 +56,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
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));
}
diff --git a/csharp/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs b/csharp/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs
index efa77047..8d12b45c 100644
--- a/csharp/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs
+++ b/csharp/ProtocolBuffers/FieldAccess/SinglePrimitiveAccessor.cs
@@ -20,12 +20,14 @@ namespace Google.ProtocolBuffers.FieldAccess {
/// <summary>
/// Access for a non-repeated field of a "primitive" type (i.e. not another message or an enum).
/// </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 builderProperty;
- private readonly PropertyInfo hasProperty;
- private readonly MethodInfo clearMethod;
+ private readonly HasDelegate<TMessage> hasDelegate;
+ private readonly ClearDelegate<TBuilder> clearDelegate;
/// <summary>
/// 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; }
}
- 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) {
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>
@@ -60,16 +64,16 @@ namespace Google.ProtocolBuffers.FieldAccess {
throw new InvalidOperationException();
}
- public virtual object GetValue(IMessage message) {
+ public virtual object GetValue(TMessage message) {
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);
}
#region Methods only related to repeated values
- public int GetRepeatedCount(IMessage message) {
+ public int GetRepeatedCount(TMessage message) {
throw new InvalidOperationException();
}
diff --git a/csharp/ProtocolBuffers/GeneratedBuilder.cs b/csharp/ProtocolBuffers/GeneratedBuilder.cs
index 35f22fc3..54d37392 100644
--- a/csharp/ProtocolBuffers/GeneratedBuilder.cs
+++ b/csharp/ProtocolBuffers/GeneratedBuilder.cs
@@ -34,8 +34,8 @@ namespace Google.ProtocolBuffers {
/// </summary>
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 {
@@ -104,7 +104,7 @@ namespace Google.ProtocolBuffers {
}
public override TBuilder ClearField(FieldDescriptor field) {
- InternalFieldAccessors[field].Clear(this);
+ InternalFieldAccessors[field].Clear(ThisBuilder);
return ThisBuilder;
}
diff --git a/csharp/ProtocolBuffers/GeneratedMessage.cs b/csharp/ProtocolBuffers/GeneratedMessage.cs
index 479986f6..0fd54f6c 100644
--- a/csharp/ProtocolBuffers/GeneratedMessage.cs
+++ b/csharp/ProtocolBuffers/GeneratedMessage.cs
@@ -33,11 +33,16 @@ namespace Google.ProtocolBuffers {
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; }
}
- protected abstract FieldAccessorTable InternalFieldAccessors { get; }
+ protected abstract FieldAccessorTable<TMessage, TBuilder> InternalFieldAccessors { get; }
public override MessageDescriptor DescriptorForType {
get { return InternalFieldAccessors.Descriptor; }
@@ -49,13 +54,13 @@ namespace Google.ProtocolBuffers {
var ret = new SortedList<FieldDescriptor, object>();
MessageDescriptor descriptor = DescriptorForType;
foreach (FieldDescriptor field in descriptor.Fields) {
- IFieldAccessor accessor = InternalFieldAccessors[field];
+ IFieldAccessor<TMessage, TBuilder> accessor = InternalFieldAccessors[field];
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)) {
- ret[field] = accessor.GetValue(this);
+ ret[field] = accessor.GetValue(ThisMessage);
}
}
return ret;
@@ -99,11 +104,11 @@ namespace Google.ProtocolBuffers {
}
public override bool HasField(FieldDescriptor field) {
- return InternalFieldAccessors[field].Has(this);
+ return InternalFieldAccessors[field].Has(ThisMessage);
}
public override int GetRepeatedFieldCount(FieldDescriptor field) {
- return InternalFieldAccessors[field].GetRepeatedCount(this);
+ return InternalFieldAccessors[field].GetRepeatedCount(ThisMessage);
}
public override object this[FieldDescriptor field, int index] {
@@ -111,7 +116,7 @@ namespace Google.ProtocolBuffers {
}
public override object this[FieldDescriptor field] {
- get { return InternalFieldAccessors[field].GetValue(this); }
+ get { return InternalFieldAccessors[field].GetValue(ThisMessage); }
}
public override UnknownFieldSet UnknownFields {
diff --git a/csharp/ProtocolBuffers/ProtocolBuffers.csproj b/csharp/ProtocolBuffers/ProtocolBuffers.csproj
index e74d94db..c057b414 100644
--- a/csharp/ProtocolBuffers/ProtocolBuffers.csproj
+++ b/csharp/ProtocolBuffers/ProtocolBuffers.csproj
@@ -34,6 +34,8 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
+ <Reference Include="System.Data" />
+ <Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="AbstractBuilder.cs" />
@@ -69,6 +71,7 @@
<Compile Include="ExtendableMessage.cs" />
<Compile Include="ExtensionInfo.cs" />
<Compile Include="ExtensionRegistry.cs" />
+ <Compile Include="FieldAccess\Delegates.cs" />
<Compile Include="FieldAccess\SingleEnumAccessor.cs" />
<Compile Include="FieldAccess\SingleMessageAccessor.cs" />
<Compile Include="FieldAccess\SinglePrimitiveAccessor.cs" />