From cc9de9111a9a23dc0e7c42f9125dcb4dc148b67d Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sun, 3 Feb 2019 16:44:47 +0900 Subject: [PATCH] Fixed IFormatter.KeyValue. All Expression.Compile Removed --- .../UniJSON/Scripts/FormatterExtensions.cs | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs b/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs index 467a588f4..dc76110ca 100644 --- a/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs +++ b/Assets/VRM/UniJSON/Scripts/FormatterExtensions.cs @@ -45,23 +45,20 @@ namespace UniJSON return method.MakeGenericMethod(typeof(T)); } - [Obsolete("error when AOT. use Key, Value")] + // + // https://stackoverflow.com/questions/238765/given-a-type-expressiontype-memberaccess-how-do-i-get-the-field-value + // public static void KeyValue(this IFormatter f, Expression> expression) { - var func = expression.Compile(); - var value = func(); - if (value != null) - { - var body = expression.Body as MemberExpression; - if (body == null) - { - body = ((UnaryExpression)expression.Body).Operand as MemberExpression; - } - f.Key(body.Member.Name); - f.Serialize(expression.Compile()()); - //var method = GetMethod(expression); - //method.Invoke(this, new object[] { value }); - } + 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)); } } }