mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-11 13:04:17 -05:00
fix KeyValue
This commit is contained in:
parent
99a150a146
commit
76a78057df
|
|
@ -50,15 +50,36 @@ namespace UniJSON
|
|||
//
|
||||
public static void KeyValue<T>(this IFormatter f, Expression<Func<T>> 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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user