Пример #1
0
        void Write(MetaType metaType, Type actual, ProtoWriter dest, int recursionLevel)
        {
            if (metaType.Type != actual)
            {
                foreach (var subType in metaType.GetSubtypes().OrderBy(st => st.FieldNumber))
                {
                    MetaType derivedType = subType.DerivedType;
                    if (derivedType.Type == metaType.Type)
                    {
                        continue;
                    }
                    if (Helpers.IsAssignableFrom(derivedType.Type, actual))
                    {
                        if (recursionLevel == 0)
                        {
                            if (derivedType.Type == actual)
                            {
                                ProtoWriter.WriteFieldHeaderComplete(WireType.Variant, dest);
                                ProtoWriter.WriteInt32(subType.FieldNumber + 1, dest);
                                return;
                            }

                            var token = ProtoWriter.StartSubItem(null, true, dest);
                            ProtoWriter.WriteFieldHeaderIgnored(WireType.Variant, dest);
                            ProtoWriter.WriteInt32(subType.FieldNumber + 1, dest);
                            Write(derivedType, actual, dest, 1);
                            ProtoWriter.EndSubItem(token, dest);
                        }
                        else
                        {
                            ProtoWriter.WriteFieldHeaderIgnored(WireType.Variant, dest);
                            ProtoWriter.WriteInt32(subType.FieldNumber + 1, dest);
                            Write(derivedType, actual, dest, recursionLevel + 1);
                        }
                        return;
                    }
                }
            }

            if (recursionLevel == 0)
            {
                ProtoWriter.WriteFieldHeaderComplete(WireType.Variant, dest);
                ProtoWriter.WriteInt32(0, dest);
            }
        }