src/Converters/KeyValuePairConverter.cs

(开头部分) 4KB

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

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

namespace Rapidity.Json.Converters
{
    internal class KeyValuePairConverter : ObjectConverter, IConverterCreator
    {
        public Type KeyType { get; }

        public Type ValueType { get; }

        private const string KeyName = "Key";
        private const string ValueName = "Value";

        public KeyValuePairConverter(Type type, Type keyType, Type valueType) : base(type)
        {
            this.KeyType = keyType;
            this.ValueType = valueType;
        }

        public override bool CanConvert(Type type)
        {
            return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>);
        }

        public override ITypeConverter Create(Type type)
        {
            var args = type.GetGenericArguments();
            return new KeyValuePairConverter(type, args[0], args[1]);
        }

        private Func<object, object, object> _createFunc;
        private Func<object, object, object> CreateFunc
        {
            get
            {
                if (_createFunc == null)
                {
                    var keyParam = Expression.Parameter(typeof(object));
                    var valueParam = Expression.Parameter(typeof(object));
                    var keyExp = Expression.Convert(keyParam, KeyType);
                    var valueExp = Expression.Convert(valueParam, ValueType);
                    var constr = Type.GetConstructor(new Type[] { KeyType, ValueType });
                    var newExp = Expression.New(constr, keyExp, valueExp);
                    var body = Expression.TypeAs(newExp, typeof(object));
                    var lambda = Expression.Lambda<Func<object, object, object>>(body, keyParam, valueParam);
                    _createFunc = lambda.Compile();
                }
                return _createFunc;
            }
        }

        public override object FromReader(JsonReader reader, JsonOption option)
        {
            object key = null;
            object value = null;
            do
            {
                switch (reader.TokenType)
后面还有 52 行代码,解锁后查看完整代码

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

AI 解读

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

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