Обычно у меня была бы фабрика, которая принимала Type
в качестве параметра, чтобы фабрика создавала уникальный производный тип. Но поскольку у вас есть несколько валидаторов, которые принимают один и тот же тип объекта для проверки (в данном случае IAccount
), я думаю, что вам нужно будет предоставить универсальный параметр для вашей фабрики, а также какой тип валидатора создать, как этот :
public static class ValidatorFactory
{
public static Validator<T> GetValidator<T>(ValidationType validationType)
where T : IValidatable
{
switch (validationType)
{
case ValidationType.AccountCreate:
return new AccountCreateValidator() as Validator<T>;
// etc...
}
}
}
Я пытался позвонить:
var value = ValidatorFactory.GetValidator<IAccount>(ValidationType.AccountCreate)
и теперь возвращается AccountCreateValidator
приведение к правильному типу Validator<IAccount>
.
Это не совсем идеально, так как теперь вам нужно знать, какой валидатор вы хотите и какой ввод он принимает, но, надеюсь, вы должны получить ошибку компиляции, если передаете неправильный тип ввода из-за явного приведения, который я добавил, например, ValidatorFactory.GetValidator<IUser>(ValidationType.AccountCreate)
должен потерпеть неудачу.
РЕДАКТИРОВАТЬ: из-за комментария о том, что это не скомпилируется, я отредактировал приведенный выше фрагмент кода, чтобы выполнить приведение как new AccountCreateValidator() as Validator<T>
. Я думал, что это может быть разыграно в любом случае, но, видимо, нет (хотя не знаю почему). Я подтвердил, что это работает в LINQPad, и я могу получить результат от валидатора.
Я также полагаю, что мой предыдущий комментарий о возможной ошибке компиляции, если вы передадите неверные универсальные типы, больше не будет рассматриваться как приведение с использованием ключевого слова as
, которое просто вернет null
, если он не смог это сделать.