From 76a78057dfadbda2bb497304e31db27d3735f4fb Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 5 Feb 2019 16:20:02 +0900 Subject: [PATCH] fix KeyValue --- .../UniJSON/Scripts/FormatterExtensions.cs | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs b/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs index dc76110ca..340dfbb68 100644 --- a/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs +++ b/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs @@ -50,15 +50,36 @@ namespace UniJSON // public static void KeyValue(this IFormatter f, Expression> expression) { - MemberExpression outerMember = (MemberExpression)expression.Body; - var outerProp = (FieldInfo)outerMember.Member; - MemberExpression innerMember = (MemberExpression)outerMember.Expression; - var innerField = (FieldInfo)innerMember.Member; - ConstantExpression ce = (ConstantExpression)innerMember.Expression; - object innerObj = ce.Value; - object outerObj = innerField.GetValue(innerObj); - f.Key(outerProp.Name); - f.Serialize(outerProp.GetValue(outerObj)); + // lambda body + var lambdaBody = (MemberExpression)expression.Body; + + if(lambdaBody.Expression.NodeType==ExpressionType.Constant) + { + // + // KeyValue(() => Field); + // + var constant = (ConstantExpression)lambdaBody.Expression; + var field = (FieldInfo)lambdaBody.Member; + f.Key(lambdaBody.Member.Name); + f.Serialize(field.GetValue(constant.Value)); + } + else + { + // + // KeyValue(() => p.Field); + // + var capture = (MemberExpression)lambdaBody.Expression; + + var captureVariable = (ConstantExpression)capture.Expression; + var captureObj = captureVariable.Value; + var captureField = (FieldInfo)capture.Member; + var captureValue = captureField.GetValue(captureObj); + + var field = (FieldInfo)lambdaBody.Member; + + f.Key(field.Name); + f.Serialize(field.GetValue(captureValue)); + } } } }