Recibo este mensaje de error System.NotSupportedException: No se admite la deserialización de los tipos de interfaz.
mientras llama a una API que tomó la solicitud como se indica a continuación.
ejemplo
[HttpPost] public IActionResult AddSomeData(MyClass MyClass) { return Ok(); } public class MyClass : MyInterface { return Ok(); } public interface MyInterface { public string SomeOtherProperties { get; set; } public MyInterface Property { get; set; } //Or reference of any other interface }He probado ejemplos dados en línea, como crear una clase concreta y agregar un atributo sobre la propiedad. Pero no está ayudando.
Como solución, eliminé la propiedad pública MyInterface { get; colocar; } y agregó la propiedad pública MyClass { get; colocar; }
¿Alguna solución mejor para esto?
El problema de deserializar a una interfaz es que se pierde información
public class MyClass : MyInterface { public string SomeOtherProperties { get; set; } public MyInterface Property { get; set; } public string importantString { get; set; } = "Don't lose me please"; } public interface MyInterface { string SomeOtherProperties { get; set; } MyInterface Property { get; set; } }Tome el ejemplo anterior, tratar de deserializar a la interfaz implicaría decirle al deserializador que solo conozca las propiedades en la interfaz, y cualquier otro campo que su usuario final esté proporcionando se eliminará por completo. Además de eso, es posible que tenga métodos en la clase concreta que admitan las propiedades de la interfaz que deben existir.
Hay algunas opciones relacionadas con la reflexión que podría usar si necesita que la API admita múltiples implementaciones de una interfaz, pero la pregunta es ¿por qué necesita la interfaz en primer lugar? Se supone que una API define claramente lo que debe proporcionar el usuario, abstraer eso con una interfaz que debe ser implementada por alguna clase concreta misteriosa parece una mala idea.
Editar: si todo lo que necesita es la información compartida y no hay nada sofisticado, puede usar MyInterface como una clase estándar
public class MyClass : MyInterface { public string nonImportantString { get; set; } = "lose me"; } public class MyInterface { public string SomeOtherProperties { get; set; } public MyInterface Property { get; set; } }Al hacerlo, su API está limpia y puede deserializar bien