src/Converters/ObjectConverter.cs

(开头部分) 13KB

这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;

namespace Rapidity.Json.Converters
{
    internal class ObjectConverter : TypeConverterBase, IConverterCreator
    {
        public ObjectConverter(Type type) : base(type)
        {
        }

        private Dictionary<string, MemberDefinition> _memberDefinitions;
        private Dictionary<string, MemberDefinition> MemberDefinitions => _memberDefinitions = _memberDefinitions ?? GetMemberDefinitions(Type);

        private IEnumerable<MemberDefinition> _memberList;

        public IEnumerable<MemberDefinition> MemberList => _memberList = _memberList ?? MemberDefinitions.Values.OrderBy(x => x.Sort);

        public MemberDefinition GetMemberDefinition(string name) => MemberDefinitions.TryGetValue(name, out MemberDefinition member) ? member : null;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="type"></param>
        /// <returns></returns>
        private Dictionary<string, MemberDefinition> GetMemberDefinitions(Type type)
        {
            var dic = new Dictionary<string, MemberDefinition>(StringComparer.CurrentCultureIgnoreCase);
            if (type == null) return dic;
            foreach (var property in type.GetProperties())
            {
                //无读权限,静态属性跳过
                if (!property.CanRead || property.GetGetMethod().IsStatic
                    || typeof(Delegate).IsAssignableFrom(property.PropertyType))
                    continue;
                //跳过委托
                if (typeof(Delegate).IsAssignableFrom(property.PropertyType)) continue;
                var attr = property.GetCustomAttribute<JsonPropertyAttribute>();
                if (attr != null && attr.Ignore) continue;
                var member = new MemberDefinition(property, attr);
                //var member = new ReflectionMemberDefinition(property, attr);
                dic[member.PropertyName] = member;
            }
            foreach (var field in type.GetFields())
            {
                //跳过委托,静态字段
                if (field.IsStatic || typeof(Delegate).IsAssignableFrom(field.FieldType)) continue;
                var attr = field.GetCustomAttribute<JsonPropertyAttribute>();
                if (attr != null && attr.Ignore) continue;
                var member = new MemberDefinition(field, attr);
                //var member = new ReflectionMemberDefinition(field, attr);
                dic[member.PropertyName] = member;
            }
            return dic;
        }

后面还有 270 行代码,解锁后查看完整代码

24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明

AI 解读

登录后可用,每次 10 积分,解读结果公开显示在下面。

还没有人解读过这个文件。