private void GenerateFormatterCode(Type type, Dictionary <string, string> formatterMap, CodeWriter.CodeWriter w) { bool allowPrivate = false; Dictionary <int, SerializeMember> members = new Dictionary <int, SerializeMember>(); foreach (PropertyInfo item in GetAllProperties(type)) { if (item.GetCustomAttribute <IgnoreMemberAttribute>(true) != null) { continue; } if (item.IsIndexer()) { continue; } MethodInfo getMethod = item.GetGetMethod(true); MethodInfo setMethod = item.GetSetMethod(true); int key = Utility.GetMethodHashCode(item.Name); var member = new SerializeMember { PropertyInfo = item, Key = key, IsReadable = (getMethod != null) && (allowPrivate || getMethod.IsPublic) && !getMethod.IsStatic, IsWritable = (setMethod != null) && (allowPrivate || setMethod.IsPublic) && !setMethod.IsStatic, }; if (!member.IsReadable || !member.IsWritable) { continue; } if (members.ContainsKey(key)) { throw new Exception("key is duplicated, all members key must be unique." + " type: " + type.FullName + " member:" + item.Name); } members.Add(key, member); } foreach (FieldInfo item in GetAllFields(type)) { if (item.GetCustomAttribute <IgnoreMemberAttribute>(true) != null) { continue; } if (item.GetCustomAttribute <System.Runtime.CompilerServices.CompilerGeneratedAttribute>(true) != null) { continue; } if (item.IsStatic) { continue; } int key = Utility.GetMethodHashCode(item.Name); var member = new SerializeMember { FieldInfo = item, Key = key, IsReadable = allowPrivate || item.IsPublic, IsWritable = allowPrivate || (item.IsPublic && !item.IsInitOnly), }; if (!member.IsReadable || !member.IsWritable) { continue; } if (members.ContainsKey(key)) { throw new Exception("key is duplicated, all members key must be unique." + " type: " + type.FullName + " member:" + item.Name); } members.Add(key, member); } var memberArray = members.Values.OrderBy(x => x.Key).ToArray(); var formatterClassName = Utility.GetFormatterClassName(type); var formatterClassGenericName = formatterClassName + type.GetGenericParameters(); var className = type.GetPureName(); var classGenericName = className + type.GetGenericParameters(); using (w.B($"public sealed class {formatterClassGenericName} : INetDataFormatter<{classGenericName}>")) { if (type.IsGenericType == false) { w._($"public static readonly {formatterClassGenericName} Instance = new {formatterClassGenericName}();"); w._(); } // Constructor /* * using (w.B($"private {formatterClassName}()")) * { * } */ // Serializer using (w.B($"public void Serialize(NetDataWriter _writer_, {classGenericName} _value_, NetDataSerializerOptions options)")) { foreach (var member in memberArray) { w._(Utility.GetWriteMethod(member.Type, $"_value_.{member.Name}")); } } using (w.B($"public {classGenericName} Deserialize(NetDataReader _reader_, NetDataSerializerOptions options)")) { foreach (var member in memberArray) { w._($"var __{member.Name} = {Utility.GetReaderMethod(member.Type)}"); } w._(); using (w.i($"return new {classGenericName}() {{", "};")) { foreach (var member in memberArray) { w._($"{member.Name} = __{member.Name},"); } } } } var ns = type.Namespace; if (ns != null) { ns += "."; } else { ns = string.Empty; } var fullFormatterClassName = ns + formatterClassName; if (type.IsGenericType) { formatterMap.Add($"typeof({type.GetSymbolDisplay(true, true)})", $"typeof({fullFormatterClassName + type.GetGenericParameters(true)})"); } else { formatterMap.Add($"typeof({type.GetSymbolDisplay(true, true)})", $"{fullFormatterClassName}.Instance"); } }