Exemple #1
0
        private object BuildObject(D2OClassDefinition classDefinition, IDataReader reader)
        {
            if (!objectCreators.ContainsKey(classDefinition.ClassType))
            {
                Func <object[], object> creator = CreateObjectBuilder(classDefinition.ClassType,
                                                                      classDefinition.Fields.Select(
                                                                          entry => entry.Value.FieldInfo).ToArray());

                objectCreators.Add(classDefinition.ClassType, creator);
            }

            var values = new List <object>();

            foreach (D2OFieldDefinition field in classDefinition.Fields.Values)
            {
                object fieldValue = ReadField(reader, field, field.TypeId);

                if (fieldValue == null || field.FieldType.IsInstanceOfType(fieldValue))
                {
                    values.Add((object)fieldValue);
                }
                else if (fieldValue is IConvertible &&
                         field.FieldType.GetInterface("IConvertible") != null)
                {
                    try
                    {
                        if (fieldValue is int && ((int)fieldValue) < 0 && field.FieldType == typeof(uint))
                        {
                            values.Add((object)unchecked ((uint)((int)fieldValue)));
                        }
                        else
                        {
                            values.Add((object)Convert.ChangeType(fieldValue, field.FieldType));
                        }
                    }
                    catch
                    {
                        throw new Exception(string.Format("Field '{0}.{1}' with value {2} is not of type '{3}'", classDefinition.Name,
                                                          field.Name, fieldValue, fieldValue.GetType()));
                    }
                }
                else
                {
                    throw new Exception(string.Format("Field '{0}.{1}' with value {2} is not of type '{3}'", classDefinition.Name,
                                                      field.Name, fieldValue, fieldValue.GetType()));
                }
            }

            return(objectCreators[classDefinition.ClassType](values.ToArray()));
        }
Exemple #2
0
        private void WriteObject(IDataWriter writer, object obj, Type type)
        {
            if (!m_allocatedClassId.ContainsKey(obj.GetType()))
            {
                DefineClassDefinition(obj.GetType());
            }

            D2OClassDefinition @class = m_classes[m_allocatedClassId[type]];

            writer.WriteInt(@class.Id);

            foreach (var field in @class.Fields)
            {
                object fieldValue = field.Value.GetValue(obj);

                WriteField(writer, field.Value.TypeId, field.Value, fieldValue);
            }
        }