Buenas a todos:
Necesito que me echéis un cable, porque no termino de entender bien esto, y sé que por aquí hay más de un experto que sabe más que yo del tema.
Tengo un programa en C# que envía datos a una WebApi en el mismo lenguaje. El caso es que los datos que envío son de este estilo: tengo artículos, que contienen una lista de lotes, y cada tipo tiene una clase heredada:
Código:
public class Batch { protected int id; }
public class DerivedBatch : Batch { public int otroId; }
public class Item
{
protected int itemId;
protected List<Batch> lista;
}
public class DerivedItem : Item { public string color; }
Bien, llegado el momento, quiero enviar un DerivedItem, pero para la lista en realidad guardo una serie de DerivedBatch. Aprovecho la herencia para no crear una clase diferente y reaprovechar código (todo esto es un ejemplo extremadamente simplificado).
Cuando envío los datos:
Código:
HttpClient client;
...
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpContent content = new StringContent(JsonConvert.SerializeObject(myItem), System.Text.Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync(_url, content);
He comprobado que se mandan todos los campos de DerivedBatch en el JSON. Sin embargo, en la WebApi:
Código:
[Route("api/item/add")]
public HttpResponseMessage PostAddItem(DerivedItem item)
{
if (item.list[0] is DerivedBatch) doStuff();
}
La comprobación siempre devuelve "false", es decir, que no lee la lista como una lista de DerivedBatch, sino como una lista de Batch a secas, y hacer un cast tipo:
Código:
(DerivedBatch)item.list[0]
Lanza una excepción porque no se puede convertir Batch en DerivedBatch.
No sé si hay alguna forma de indicar a la WebApi que el contenido de la lista es de tipo DerivedBatch o no.
Hasta ahora, la única solución que se me ha ocurrido (y perdón si hago algo horrible) es la de convertir la lista en tipo virtual, y redeclararla en DerivedItem:
Código:
public class Batch { protected int id; }
public class DerivedBatch : Batch { public int otroId; }
public class Item
{
protected int itemId;
protected virtual List<Batch> lista; //<----
}
public class DerivedItem : Item
{
public new List<DerivedBatch> lista; //<----
public string color;
}
Porque no me deja usar "override" si el tipo del dato es diferente al que sobreescribe. Lo he comprobado, y funciona, pero no me gusta tener código mal escrito y quiero saber cuál sería la forma más correcta de hacer esto.
¿Algún entendido en HTML HTTP o en C#... o en cualquier lenguaje orientado a clases, sabe cómo hacer esto?
Marcadores