diff options
Diffstat (limited to 'src/ProtocolBuffers/Descriptors/MessageDescriptor.cs')
-rw-r--r-- | src/ProtocolBuffers/Descriptors/MessageDescriptor.cs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs b/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs index 17ad37fd..cdd75a0c 100644 --- a/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs +++ b/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs @@ -29,6 +29,7 @@ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +using System; using System.Collections.Generic; using Google.ProtocolBuffers.DescriptorProtos; @@ -123,6 +124,15 @@ namespace Google.ProtocolBuffers.Descriptors { } /// <summary> + /// Finds a field by field name. + /// </summary> + /// <param name="name">The unqualified name of the field (e.g. "foo").</param> + /// <returns>The field's descriptor, or null if not found.</returns> + public FieldDescriptor FindFieldByName(String name) { + return File.DescriptorPool.FindSymbol<FieldDescriptor>(FullName + "." + name); + } + + /// <summary> /// Finds a field by field number. /// </summary> /// <param name="number">The field number within this message type.</param> @@ -132,6 +142,22 @@ namespace Google.ProtocolBuffers.Descriptors { } /// <summary> + /// Finds a field by its property name, as it would be generated by protogen. + /// </summary> + /// <param name="propertyName">The property name within this message type.</param> + /// <returns>The field's descriptor, or null if not found.</returns> + public FieldDescriptor FindFieldByPropertyName(string propertyName) { + // For reasonably short messages, this will be more efficient than a dictionary + // lookup. It also means we don't need to do things lazily with locks etc. + foreach (FieldDescriptor field in Fields) { + if (field.CSharpOptions.PropertyName == propertyName) { + return field; + } + } + return null; + } + + /// <summary> /// Finds a nested descriptor by name. The is valid for fields, nested /// message types and enums. /// </summary> @@ -198,5 +224,28 @@ namespace Google.ProtocolBuffers.Descriptors { } return false; } + + /// <summary> + /// See FileDescriptor.ReplaceProto + /// </summary> + internal override void ReplaceProto(DescriptorProto newProto) { + base.ReplaceProto(newProto); + + for (int i = 0; i < nestedTypes.Count; i++) { + nestedTypes[i].ReplaceProto(newProto.GetNestedType(i)); + } + + for (int i = 0; i < enumTypes.Count; i++) { + enumTypes[i].ReplaceProto(newProto.GetEnumType(i)); + } + + for (int i = 0; i < fields.Count; i++) { + fields[i].ReplaceProto(newProto.GetField(i)); + } + + for (int i = 0; i < extensions.Count; i++) { + extensions[i].ReplaceProto(newProto.GetExtension(i)); + } + } } } |