Вот код:
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 - скажем, BaseEntity?В настоящее время я использую неуниверсальный IValidator, который принимает «объектный объект», но он не очень хорош и не безопасен для типов.
Забавно, что C # позволяет компилировать:
var test = (IValidator<BaseEntity>)new OrderValidator();
, но во время выполнения происходит сбой с
Unable to cast object of type 'OrderValidator' to type 'IValidator`1[Orders.Core.BaseEntity]'
Это то же исключение, которое дает мне Виндзор (я пробовал поиск как в Виндзоре, так и в ручном режиме, эта проблема на самом деле не связана с этим, только сприведение интерфейсов).
Благодаря Хайнци я теперь понимаю, почему не могу выполнить приведение типов - потому что IValidator for Order ожидает Order как универсальный тип.Но как мне вернуть список IValidator для разных типов?Причина в том, что BaseEntity принимает свой реальный тип и собирает все валидаторы - для всех типов от GetType () до объекта.Мне бы очень хотелось иметь общий GetValidators (), а затем работать с ним.