public void Add(MemberSerializerStruct item) { var membersCount = _members.Count; if (membersCount >= 255) { throw new Exception("To many fields!"); } for (var i = 0; i < membersCount; i++) { if (item.Hash == _members[i].Hash) { throw new Exception("Hash already added!"); } if (item.Hash < _members[i].Hash) { _members.Insert(i, item); return; } } _members.Add(item); }
public bool AddField <TMember>(int hash, ByRefFieldWriter <T, TMember> .SetDelegate set, ByRefFieldWriter <T, TMember> .GetDelegate get) { if (set == null) { throw new ArgumentNullException(nameof(set)); } if (get == null) { throw new ArgumentNullException(nameof(get)); } var memberType = typeof(TMember); if (Serializer.TryGetDataSerializer(memberType, out var methods, false) == false) { _serializer.Logger.Error($"{typeof(T)} custom serializer, cannot get serialization methods for field of type {memberType}"); return(false); } var toAdd = new MemberSerializerStruct(hash, new ByRefFieldWriter <T, TMember>(methods, set, get)); Add(toAdd); return(true); }
public bool AddBackingField(int hash, string propertyName) { if (propertyName == null) { throw new ArgumentNullException(nameof(propertyName)); } var type = typeof(T); var formattedFieldName = $"<{propertyName}>k__BackingField"; var field = type.GetField(formattedFieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); if (field == null) { _serializer.Logger.Error($"{type} custom serializer, cannot get backing field for property {propertyName}"); return(false); } if (Serializer.TryGetDataSerializer(field.FieldType, out var methods, false) == false) { _serializer.Logger.Error($"{type} custom serializer, cannot get serialization methods for field of type {field.FieldType}"); return(false); } var toAdd = new MemberSerializerStruct(hash, new StructFieldWriter(methods, field)); Add(toAdd); return(true); }
public void AddProperty <TMember>(int hash, string name) { var memberType = typeof(TMember); var type = typeof(T); if (Serializer.TryGetDataSerializer(memberType, out var methods, false) == false) { _serializer.Logger.Error($"{type} custom serializer, cannot get serialization methods for field of type {memberType}"); return; } var property = type.GetProperty(name); if (property == null) { _serializer.Logger.Error($"{type} custom serializer, cannot get property {name} of type {memberType}"); return; } var get = (GetPropertyDelegate <T, TMember>)Delegate.CreateDelegate(typeof(GetPropertyDelegate <T, TMember>), null, property.GetGetMethod()); var set = (SetPropertyDelegate <T, TMember>)Delegate.CreateDelegate(typeof(SetPropertyDelegate <T, TMember>), null, property.GetSetMethod()); var toAdd = new MemberSerializerStruct(hash, new PropertyWriter <T, TMember>(methods, set, get)); Add(toAdd); }
public bool AddArrayField <TElement>(int hash, FieldArrayWriter <T, TElement> .GetLengthDelegate getLength, FieldArrayWriter <T, TElement> .GetElementDelegate getElement, FieldArrayWriter <T, TElement> .SetLengthDelegate setLength, FieldArrayWriter <T, TElement> .SetElementDelegate setElement) { var memberType = typeof(TElement); if (_serializer.TryGetDataSerializer(memberType, out var elementSerializer, false) == false) { _serializer.Logger.Error($"{typeof(T)} custom serializer, cannot get serialization methods for element of type {memberType}"); return(false); } var toAdd = new MemberSerializerStruct(hash, new FieldArrayWriter <T, TElement>(elementSerializer, getLength, setLength, getElement, setElement, _serializer)); Add(toAdd); return(true); }