|
|
|
@ -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()); } |
|
|
|
|
} |
|
|
|
|