tengo el siguiente escenario:Llamar a un método genérico con el correcto tipo derivado
que tengo tres clases, llamémosles A
, B
y C
. Todo lo que tienen en común es que heredan de la misma interfaz, ISomeInterface
y que son clases que se asignan a entidades que usan Entity Framework.
Tengo un método que recibió una lista de objetos que implementa esta interfaz, pero los objetos en sí serán instancias de A
, B
o C
.
shell El método se parece a esto
public void MyMethod(List<ISomeInterface> entityList)
{
foreach(var entity in entityList)
{
ProcessEntity(entity);
}
}
Ahora, el problema es con el método de ProcessEntity
. Este es un método genérico, que necesita para recuperar la tabla de elementos coincidentes de la base de datos de acuerdo con el tipo o entidad, por lo que se ve así:
public void ProcessEntity<T>(T entity)
{
using(var repository = new DbRepository())
{
var set = repository.Set<T>();
...
}
}
El problema es que la línea var set = repository.Set<T>();
falla porque T
es ISomeInterface
en este caso, y no el tipo real (A
, B
o C
), por lo que da una excepción que no puede relacionarse con el tipo dado, lo que es comprensible.
Así que mi pregunta es: ¿cómo puedo llamar a ProcessEntity con el tipo real del objeto dentro de la lista, y no el tipo de interfaz que implementan?
Eso hizo el truco. Cambio 'ProcessEntity (obj);' a 'ProcessEntity (obj as dynamic);', y eso funcionó bien. Un uso dinámico que no sabía.Muchas gracias :) –
@ ØyvindKnobloch-Bråthen sí, me gusta mucho esta tipificación en tiempo de ejecución –