diff --git a/Assets/VRM/UniJSON/Scripts/JsonSchemaValidator/JsonObjectValidator.cs b/Assets/VRM/UniJSON/Scripts/JsonSchemaValidator/JsonObjectValidator.cs index 2c6de6c23..e0a026014 100644 --- a/Assets/VRM/UniJSON/Scripts/JsonSchemaValidator/JsonObjectValidator.cs +++ b/Assets/VRM/UniJSON/Scripts/JsonSchemaValidator/JsonObjectValidator.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Linq.Expressions; using System.Reflection; + namespace UniJSON { /// @@ -306,27 +306,13 @@ namespace UniJSON } public static void CreateFieldProcessors( - string methodName, + Func creator, Dictionary processors ) { - var mi = typeof(G).GetMethod(methodName, BindingFlags.Static | BindingFlags.NonPublic); - - var t = typeof(T); foreach (var fi in GetFields()) { - var value = Expression.Parameter(t, "value"); - var fieldValue = Expression.Field(value, fi); - var compileld = Expression.Lambda(fieldValue, value).Compile(); - - var getter = Expression.Constant(compileld); - var name = Expression.Constant(fi.Name); - - var g = mi.MakeGenericMethod(fi.FieldType); - var call = Expression.Call(g, getter, name); - var lambda = (Func)Expression.Lambda(call).Compile(); - - processors.Add(fi.Name, lambda()); + processors.Add(fi.Name, creator(fi)); } } } @@ -346,12 +332,23 @@ namespace UniJSON Dictionary m_validators; - static FieldValidator CreateFieldValidator(Func getter, string name) + static FieldValidator CreateFieldValidator(FieldInfo fi) { + var mi = typeof(ObjectValidator).GetMethod("_CreateFieldValidator", + BindingFlags.Static | BindingFlags.NonPublic) + ; + var g = mi.MakeGenericMethod(fi.FieldType); + return (FieldValidator)g.Invoke(null, new object[] { fi }); + } + + static FieldValidator _CreateFieldValidator(FieldInfo fi) + { + var getter = (Func)((t) => (U)fi.GetValue(t)); + return (JsonSchema s, JsonSchemaValidationContext c, T o, out bool isIgnorable) => { var v = s.Validator; - using (c.Push(name)) + using (c.Push(fi.Name)) { var field = getter(o); var ex = v.Validate(c, field); @@ -367,7 +364,7 @@ namespace UniJSON { var validators = new Dictionary(); GenericFieldView.CreateFieldProcessors( - "CreateFieldValidator", validators); + CreateFieldValidator, validators); m_validators = validators; } @@ -496,14 +493,27 @@ namespace UniJSON Dictionary m_serializers; - static FieldSerializer CreateFieldSerializer(Func getter, string name) + static FieldSerializer CreateFieldSerializer(FieldInfo fi) { + var mi = typeof(Serializer).GetMethod("_CreateFieldSerializer", + BindingFlags.Static | BindingFlags.NonPublic); + var g = mi.MakeGenericMethod(fi.FieldType); + return (FieldSerializer)g.Invoke(null, new object[] { fi }); + } + + static FieldSerializer _CreateFieldSerializer(FieldInfo fi) + { + Func getter = t => + { + return (U)fi.GetValue(t); + }; + return (s, c, f, o, vRes, deps) => { var v = s.Validator; var field = getter(o); - if (vRes[name].Ex != null) + if (vRes[fi.Name].Ex != null) { return; } @@ -519,7 +529,7 @@ namespace UniJSON } } - f.Key(name); + f.Key(fi.Name); v.Serialize(f, c, field); }; } @@ -528,7 +538,7 @@ namespace UniJSON { var serializers = new Dictionary(); GenericFieldView.CreateFieldProcessors( - "CreateFieldSerializer", serializers); + CreateFieldSerializer, serializers); m_serializers = serializers; }