У меня возникла проблема (вероятно, из-за того, что я не знаком с дженериками C#) при получении незамкнутого типа дженерика. У меня есть несколько методов, которые выглядят довольно похожими на следующие, за исключением используемого явного интерфейса валидатора.
public IEnumerable<IDeleteValidator<T>> GetDeleteValidators<T>()
{
var validatorList = new List<IDeleteValidator<T>>();
foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T)))
{
var validatorType = typeof(IDeleteValidator<>).MakeGenericType(type);
var validators = ObjectFactory
.GetAllInstances(validatorType).Cast<IDeleteValidator<T>>();
validatorList.AddRange(validators);
}
return validatorList;
}
Метод GetRecursiveBaseTypesAndInterfaces делает то, что он говорит, и собирает все базовые типы и интерфейсы данного типа. Итак, что я в конечном итоге делаю, так это получаю незакрытый тип явного интерфейса валидатора и получаю его тип как закрытый для каждого из базовых классов и интерфейсов исходного типа T. Это прекрасно работает, однако я хотел бы очистить свой код и выполнить это в более общей форме, чем указано выше.
зная, что любой валидатор T будет расширять IValidator (как показано ниже)
public interface IDeleteValidator<in T> : IValidator<T> {}
Моя незавершенная попытка универсальной версии описанного выше метода выглядит так:
public IEnumerable<TValidator> GetValidators<T, TValidator>()
where TValidator : IValidator<T>
{
var validatorList = new List<TValidator>();
foreach (var type in GetRecursiveBaseTypesAndInterfaces(typeof(T)))
{
var unclosedType = ???
var validatorType = typeof(unclosedType).MakeGenericType(type);
var validators = ObjectFactory
.GetAllInstances(validatorType).Cast<TValidator>();
validatorList.AddRange(validators);
}
return validatorList;
}
Как определить unclosedType (или реструктурировать метод), чтобы он выполнял ту же работу, что и исходный метод с вызовом
GetValidators<Whatever, IDeleteValidator<Whatever>>();
Или можно было бы усовершенствовать мой метод, так как будет достаточно вызова, подобного следующему?
GetValidators<IDeleteValidator<Whatever>>();