67 lines
2.7 KiB
C#
67 lines
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq.Expressions;
|
|
using System.Reflection;
|
|
|
|
namespace CPF.Windows.Json.Deserialize
|
|
{
|
|
[ExpressionBuildType(DeserializeBuildTypeEnum.KeyValuePair)]
|
|
internal class KeyValuePairBuild : ExpressionJsonResolve
|
|
{
|
|
internal static BlockExpression Build(Type type)
|
|
{
|
|
|
|
Type keyType = type.GetGenericArguments()[0];
|
|
Type valueType = type.GetGenericArguments()[1];
|
|
List<Expression> methodCall = new List<Expression>();
|
|
Type keyValuePairType = typeof(KeyValuePair<,>).MakeGenericType(keyType, valueType);
|
|
LabelTarget returnValueLable = Expression.Label(keyValuePairType, "returnValue");
|
|
|
|
ConstructorInfo ctor = keyValuePairType.GetConstructor(new[] { keyType, valueType });
|
|
ParameterExpression key = Expression.Variable(keyType, "key");
|
|
ParameterExpression value = Expression.Variable(valueType, "value");
|
|
|
|
/*
|
|
ReadObjLeft()
|
|
*/
|
|
methodCall.Add(Expression.Call(ExpressionMembers.Reader, JsonReader._ReadObjLeft));
|
|
/*
|
|
if(reader.ReadBoolObjRight)
|
|
return new KeyValuePair<,>(default,default);
|
|
*/
|
|
methodCall.Add(
|
|
Expression.IfThen(
|
|
Expression.Call(ExpressionMembers.Reader, JsonReader._ReadBoolObjRight),
|
|
Expression.Return(returnValueLable, Expression.New(ctor, keyType.IsValueType ? (Expression)Expression.New(keyType) : Expression.Constant(null, keyType), valueType.IsValueType ? (Expression)Expression.New(valueType) : Expression.Constant(null, valueType)))));
|
|
|
|
/*
|
|
ReadKey()
|
|
*/
|
|
methodCall.Add(ExpressionMembers.GenerateKeyValuePairByReadKey(keyType, key));
|
|
|
|
/*
|
|
reader.ReadColon()
|
|
*/
|
|
methodCall.Add(Expression.Call(ExpressionMembers.Reader, JsonReader._ReadColon));
|
|
|
|
/*
|
|
value = ResolveProvider<ValueType>.InvokeGet(reader, handler);
|
|
*/
|
|
methodCall.Add(Expression.Assign(value, ExpressionMembers.GetMethodCall(valueType)));
|
|
|
|
/*
|
|
reader.ReadObjRight();
|
|
*/
|
|
methodCall.Add(Expression.Call(ExpressionMembers.Reader, JsonReader._ReadObjRight));
|
|
|
|
/*
|
|
return new KeyValuePair<,>(key,value);
|
|
*/
|
|
methodCall.Add(Expression.Return(returnValueLable, Expression.New(ctor, key, value)));
|
|
methodCall.Add(Expression.Label(returnValueLable, Expression.New(ctor, key, value)));
|
|
|
|
return Expression.Block(new[] { key, value }, methodCall);
|
|
}
|
|
}
|
|
}
|