示例#1
0
        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");
            }
        }