diff options
Diffstat (limited to 'csharp/ProtocolBuffers/GeneratedMessage.cs')
-rw-r--r-- | csharp/ProtocolBuffers/GeneratedMessage.cs | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/csharp/ProtocolBuffers/GeneratedMessage.cs b/csharp/ProtocolBuffers/GeneratedMessage.cs index e1de84e1..479986f6 100644 --- a/csharp/ProtocolBuffers/GeneratedMessage.cs +++ b/csharp/ProtocolBuffers/GeneratedMessage.cs @@ -18,6 +18,7 @@ using System.Collections.Generic; using Google.ProtocolBuffers.Collections; using Google.ProtocolBuffers.Descriptors; using Google.ProtocolBuffers.FieldAccess; +using System.Collections; namespace Google.ProtocolBuffers { @@ -60,6 +61,39 @@ namespace Google.ProtocolBuffers { return ret; } + public override bool IsInitialized { + get { + // Check that all required fields are present. + foreach (FieldDescriptor field in DescriptorForType.Fields) { + if (field.IsRequired && !HasField(field)) { + return false; + } + } + + // Check that embedded messages are initialized. + // This code is similar to that in AbstractMessage, but we don't + // fetch all the field values - just the ones we need to. + foreach (FieldDescriptor field in DescriptorForType.Fields) { + if (field.MappedType == MappedType.Message) { + if (field.IsRepeated) { + // We know it's an IList<T>, but not the exact type - so + // IEnumerable is the best we can do. (C# generics aren't covariant yet.) + foreach (IMessage element in (IEnumerable) this[field]) { + if (!element.IsInitialized) { + return false; + } + } + } else { + if (!((IMessage) this[field]).IsInitialized) { + return false; + } + } + } + } + return true; + } + } + public override IDictionary<FieldDescriptor, object> AllFields { get { return Dictionaries.AsReadOnly(GetMutableFieldMap()); } } |