Я действительно обнаружил, что мне не нужно обнаружение во время выполнения, потому что я могу предоставить тип во время компиляции в моих контроллерах MVC, которые, в отличие от репозитория (который только один), зависят от типа (у меня есть PageController, BlogController и т.д. .) вот так:
public virtual ActionResult Print(int prettyId)
{
//Document invoice = _repository.Load(prettyId, _docType);
Document invoice = _repository.Load<Invoice>(prettyId);
...
}
В моем интерфейсе репозитория теперь есть следующее:
// also, please comment, which one is better, this one?
T Load<T>(int prettyId) where T : Document;
T Load<T>(Guid firmId, int prettyId) where T : Document;
// or this one?
//T Load<T1>(int prettyId) where T1 : Document;
//T Load<T1>(Guid firmId, int prettyId) where T1 : Document;
и в реализации репозитория у меня это:
public T Load<T>(int prettyId) where T : Document
{
return Load<T>(AppState.FirmId, prettyId);
}
public T Load<T>(Guid firmId, int prettyId) where T : Document
{
var instance =
(from c in _ctx.Documents.OfType<T>()
where c.firm_id == firmId && c.PrettyId == prettyId
select c).FirstOrDefault();
instance.FirmReference.Load();
instance.ClientReference.Load();
instance.DocumentItems.Load();
instance.TaxStatementReference.Load();
return instance;
}
Это работает и выглядит довольно мило.