Example #1
0
 private void WritePrimitiveField(MemberInfo meminf, object value)
 {
     if (meminf.FieldType == typeof(string))
     {
         WriteStringZeroTerminated((string)value);
     }
     else if (meminf.FieldType == typeof(int))
     {
         Write((int)value);
     }
     else if (meminf.FieldType == typeof(uint))
     {
         if (meminf.IsReference)
             WriteReference((uint)value, meminf.ReferencedFormKinds);
         else
             Write((uint)value);
     }
     else if (meminf.FieldType == typeof(long))
     {
         Write((long)value);
     }
     else if (meminf.FieldType == typeof(ulong))
     {
         Write((ulong)value);
     }
     else if (meminf.FieldType == typeof(short))
     {
         Write((short)value);
     }
     else if (meminf.FieldType == typeof(ushort))
     {
         Write((ushort)value);
     }
     else if (meminf.FieldType == typeof(char))
     {
         segmentStream.WriteByte(Convert.ToByte((char)value));
     }
     else if (meminf.FieldType == typeof(byte))
     {
         segmentStream.WriteByte((byte)value);
     }
     else if (meminf.FieldType == typeof(float))
     {
         if (meminf.IsFakeFloat)
         {
             Write((int)((float)value * 100));
         }
         else
         {
             Write((float)value);
         }
     }
     else
     {
         throw new InvalidProgramException("Unsupported primitive field type: " + meminf.FieldType.FullName);
     }
 }
Example #2
0
        internal void WriteField(object target, MemberInfo meminfo)
        {
            var value = meminfo.GetValue(target);

            // Skip null fields right away (covers nullable primitive types)
            if (value == null)
                return;

            // Skip null form references (that are not a list of references) unless it is a required field
            if (meminfo.IsReference && !meminfo.IsListType && (uint)value == 0 && !meminfo.IsRequired)
                return;

            string fieldName = meminfo.FieldNames.First();
            if (meminfo.IsPrimitiveType)
            {
                // Primitive types have only one propery name
                if (meminfo.IsListType)
                {
                    foreach (var item in (IEnumerable)value)
                    {
                        BeginPropertySegment(fieldName);
                        WritePrimitiveField(meminfo, item);
                        EndSegment();
                    }
                }
                else
                {
                    BeginPropertySegment(fieldName);
                    WritePrimitiveField(meminfo, value);
                    EndSegment();
                }
            }
            else
            {
                if (meminfo.FieldType.IsSubclassOf(typeof(Compound)))
                {
                    if (meminfo.IsListType)
                    {
                        foreach (var item in (IEnumerable)value)
                        {
                            WriteCompoundField((Compound)item);
                        }
                    }
                    else
                    {
                        WriteCompoundField((Compound)value);
                    }
                }
                else
                {
                    if (meminfo.IsListType)
                    {
                        foreach (var item in (IEnumerable)value)
                        {
                            WriteStructuredField((Field)item, fieldName);
                        }
                    }
                    else
                    {
                        WriteStructuredField((Field)value, fieldName);
                    }
                }
            }
        }