Как применить JSON документ патча к классу, содержащему коллекцию типов интерфейса - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть следующий код:

public class Customer
    {
        public string CustomerName { get; set; }

        [JsonConverter(typeof(ConcreteConverter<Order>))]
        public List<IOrderContract> Orders { get; set; }      
    }


public class Order : IOrderContract {
        public string OrderName { get; set; }
        public string OrderType { get; set; }
    }



public interface IOrderContract
    {
        string OrderName { get; set; }
        string OrderType { get; set; }
    }

Когда я применяю патч, используя следующий код:

 public IActionResult JsonPatchWithoutModelState([FromBody] JsonPatchDocument<Customer> patchDoc)
        {
            var customer = CreateCustomer();

            patchDoc.ApplyTo(customer);

            return new ObjectResult(customer);
        }



private Customer CreateCustomer()
        {
            return new Customer
            {
                CustomerName = "John",
                Orders = new List<IOrderContract>()
                {
                    new Order
                    {
                        OrderName = "Order0"
                    },
                    new Order
                    {
                        OrderName = "Order1"
                    }
                }
            };
        }

Выдает исключение, что *

Значение '[{"OrderName": "name", "OrderType": "type"}]' недопустимо для целевого местоположения.

*

Но когда я использую коллекцию конкретных классов как показано ниже вместо интерфейса:

public class Customer
        {
            public string CustomerName { get; set; }    

            public List<Order> Orders { get; set; }      
        }

, тогда он работает нормально. Я глубоко погрузился в jsonpatchdocument и обнаружил, что он не может создать экземпляр для интерфейса, что является очевидной ошибкой, т.е.

Не удалось создать экземпляр типа IOrderContract. Тип является интерфейсом или абстрактным классом и не может быть создан.

Есть ли какое-либо другое решение для этого для преобразования патчей с интерфейсами?

...