Mam problem (prawdopodobnie z powodu braku znajomości generycznych C#) w uzyskiwaniu niezamkniętego typu generycznego. Mam kilka metod, które wyglądają dość podobnie do poniższych, z wyjątkiem jawnie używanego interfejsu weryfikatora.Pobieranie typu niezamkniętego typu ogólnego zamykającego typ ogólny
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;
}
W GetRecursiveBaseTypesAndInterfaces metoda robi jak mówi i gromadzi wszystkie typy bazowe i interfejsy danego typu. Tak więc w końcu robię to uzyskując niezamknięty typ jawnego interfejsu walidatora i uzyskując jego typ jako zamknięty dla każdej z klas bazowych i interfejsów oryginalnego typu T. Działa to doskonale, jednak chciałbym, aby oczyścić mój kod i osiągnięcia tego celu w postaci bardziej ogólne niż wyżej
wiedząc, że każda walidator T rozszerzy IValidator (jak mieszka)
public interface IDeleteValidator<in T> : IValidator<T> {}
Moja niewykonanej próba generycznej wersji powyższej metody wygląda następująco:
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;
}
jak mogę określić unclosedType (lub zrestrukturyzować metody), aby wykonać tę samą pracę, jak i metoda iginalna z numerem telefonu:
GetValidators<Whatever, IDeleteValidator<Whatever>>();
Czy możliwe byłoby udoskonalenie mojej metody, aby wystarczyło połączenie w następujący sposób?
GetValidators<IDeleteValidator<Whatever>>();
To rozwiązało dokładnie problem. Dzięki. – rheone