src/Converters/EnumerableConverter.cs
(开头部分) 5KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
namespace Rapidity.Json.Converters
{
/// <summary>
/// 实现了IEnumerable类型的解析
/// </summary>
internal abstract class EnumerableConverter : TypeConverterBase, IConverterCreator
{
public Type ItemType { get; protected set; }
public EnumerableConverter(Type type, Type itemType) : base(type)
{
ItemType = itemType;
}
private Action<object, object> _addItem;
public Action<object, object> AddItem => _addItem = _addItem ?? BuildAddItemMethod(Type);
protected virtual Action<object, object> BuildAddItemMethod(Type type)
{
var listExp = Expression.Parameter(typeof(object), "list");
var itemExp = Expression.Parameter(typeof(object), "item");
var instanceExp = Expression.Convert(listExp, type);
var argumentExp = Expression.Convert(itemExp, ItemType);
var addMethod = type.GetMethod(AddMethodName);
var callExp = Expression.Call(instanceExp, addMethod, argumentExp);
Expression<Action<object, object>> addItemExp = Expression.Lambda<Action<object, object>>(callExp, listExp, itemExp);
return addItemExp.Compile();
}
protected virtual string AddMethodName => "Add";
private Func<object, IEnumerator> _getEnumerator;
public Func<object, IEnumerator> GetEnumerator => _getEnumerator = _getEnumerator ?? BuildGetEnumberatorMethod(Type);
protected virtual Func<object, IEnumerator> BuildGetEnumberatorMethod(Type type)
{
var paramExp = Expression.Parameter(typeof(object), "list");
var listExp = Expression.TypeAs(paramExp, type);
var method = type.GetMethod(nameof(IEnumerable.GetEnumerator));
var callExp = Expression.Call(listExp, method);
var body = Expression.TypeAs(callExp, typeof(IEnumerator));
var expression = Expression.Lambda<Func<object, IEnumerator>>(body, paramExp);
return expression.Compile();
}
public abstract bool CanConvert(Type type);
public abstract ITypeConverter Create(Type type);
public override object FromReader(JsonReader reader, JsonOption option)
{
object instance = null;
var convert = option.ConverterProvider.Build(ItemType);
后面还有 63 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 积分/个。 规则说明
AI 解读
登录后可用,每次 10 积分,解读结果公开显示在下面。
还没有人解读过这个文件。
