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