Здесь код:
public interface IValidator<T>
{
bool IsValid(T obj);
}
public class OrderValidator: IValidator<Order>
{
// ...
}
public class BaseEntity
{
}
public class Order: BaseEntity
{
}
Проблема в том, что я не могу:
var validator = new OrderValidator();
// this line throws because type can't be converted
var baseValidator = (IValidator<BaseEntity>)validator;
// all this is because I need a list with IValidator<Order>, IValidator<BaseOrder>, etc.
IList<IValidator<BaseEntity>> allValidators = ...
Как получить и сохранить список всех реализаций IValidator <T> для базы T - скажем, BaseEntity? В настоящее время я делаю не общий идентификатор, который принимает "объект obj", но это не хорошо, а не безопасно.
Забавно, что С# позволяет компилировать:
var test = (IValidator<BaseEntity>)new OrderValidator();
но сбой при выполнении
Unable to cast object of type 'OrderValidator' to type 'IValidator`1[Orders.Core.BaseEntity]'
Это то же самое исключение, которое дает Windsor (я пробовал поиск по Windsor и ручному типу, эта проблема действительно не связана с этим, только с линией интерфейса).
Благодаря Хайнци, теперь я вижу, почему я не могу бросить - потому что Ивалидатор для Ордера ожидает, что порядок будет использоваться как общий тип. Но как мне вернуть список IValidator для разных типов? Причина в том, что BaseEntity принимает свой реальный тип и собирает все валидаторы - для всех типов из GetType() для объекта. Я действительно хотел бы иметь общий GetValidators(), а затем работать с ним.