Wywołanie metody ogólnej z poprawnym typem pochodnym
Mam następujący scenariusz:
Mam trzy klasy, nazwijmy jeA
, B
iC
. Jedyne co ich łączy to dziedziczenie z tego samego interfejsu,ISomeInterface
i że są to klasy odwzorowane na jednostki używające Entity Framework.
Mam metodę, która otrzymała listę obiektów implementujących ten interfejs, ale same obiekty będą instancjamiA
, B
lubC
.
Powłoka metody wygląda tak
public void MyMethod(List<ISomeInterface> entityList)
{
foreach(var entity in entityList)
{
ProcessEntity(entity);
}
}
Teraz problem jest zProcessEntity
metoda. Jest to ogólna metoda, która musi pobrać tabelę pasujących elementów z bazy danych zgodnie z typem lub jednostką, więc wygląda to tak:
public void ProcessEntity<T>(T entity)
{
using( var repository = new DbRepository())
{
var set = repository.Set<T>();
...
}
}
Problem polega na tym, że liniavar set = repository.Set<T>();
zawodzi, ponieważT
jestISomeInterface
w tym przypadku, a nie rzeczywisty typ (A
, B
lubC
), więc daje wyjątek, który nie może odnosić się do danego typu, co jest zrozumiałe.
Moje pytanie brzmi: jak mogę wywołać ProcessEntity z rzeczywistym typem obiektu na liście, a nie z wprowadzonym przez niego typem interfacetype.