private Action <JsonSerializer> CompileAction(ModelTypeResolver modelTypeResolver) { Type modelBinderType; var framework = RuntimeInformation.FrameworkDescription; if (framework.StartsWith(DotNetFramework)) { modelBinderType = Assembly.GetExecutingAssembly() .GetType($"{GetType().Namespace}.{nameof(ModelSerializationBinderNetFramework)}"); } else if (framework.StartsWith(DotNetCore)) { modelBinderType = Assembly.GetExecutingAssembly() .GetType($"{GetType().Namespace}.{nameof(ModelSerializationBinderNetCore)}"); } else { throw new NotSupportedException( $"'Substitution of json serializer binder for the RavenDb isn't supported under '{framework}' framework."); } // Creates lambda expression delegate // (serializer) => serializer.Binder = new AppropriateSerializerBinder(serializer.Binder, modelTypeResolver) var p = Expression.Parameter(typeof(JsonSerializer)); var binderProperty = Expression.Property(p, nameof(JsonSerializer.Binder)); var binderSetter = Expression.Assign(binderProperty, Expression.New(modelBinderType.GetConstructors().Single(), binderProperty, Expression.Constant(modelTypeResolver))); return(Expression.Lambda <Action <JsonSerializer> >(binderSetter, p).Compile()); }
public ModelSerializationBinderSetter(ModelTypeResolver modelTypeResolver) { if (modelTypeResolver is null) { throw new ArgumentNullException(nameof(modelTypeResolver)); } _setBinderAction = CompileAction(modelTypeResolver); }
public ModelSerializationBinderNetCore(SerializationBinder binder, ModelTypeResolver resolver) { _internalBinder = binder; _resolver = resolver; }