2012-11-07 12 views
6

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>>(); 

Odpowiedz

2

ja nie nadążam pytanie (bardziej ze względu na moją senność niż cokolwiek innego), ale jesteś po:

var unclosedTyped = type.GetGenericTypeDefinition(); 

? (Szczegółowe informacje znajdują się w części docs).

+0

To rozwiązało dokładnie problem. Dzięki. – rheone

Powiązane problemy