2012-11-07 21 views
6

Ho un problema (probabilmente dovuto alla mia mancanza di familiarità con i generici C#) nell'ottenere il tipo non chiuso di un generico. Ho diversi metodi che sembrano piuttosto simili ai seguenti tranne l'interfaccia di validatore esplicita in uso.Recupero del tipo non chiuso di un tipo generico che chiude un tipo generico

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; 
} 

I GetRecursiveBaseTypesAndInterfaces metodo non come si dice e raccoglie tutti i tipi di base e le interfacce di un dato tipo. Quindi, quello che sto facendo è ottenere il tipo non chiuso dell'interfaccia di convalida esplicita e ottenere il suo tipo come chiuso su ciascuna delle classi base e delle interfacce del tipo T originale. Questa grande opera, però mi piacerebbe pulire il codice e ottenere questo risultato in una forma più generica di sopra

sapendo che qualsiasi validatore di T si estenderà IValidator (come muggito)

public interface IDeleteValidator<in T> : IValidator<T> {} 

mio incompiuto tentativo di una versione generica del metodo di cui sopra appare come:

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; 
} 

come faccio a definire unclosedType (o ristrutturare il metodo) per fare lo stesso lavoro come o Metodo iginal con una chiamata a

GetValidators<Whatever, IDeleteValidator<Whatever>>(); 

O sarebbe possibile definire il mio metodo tanto più che una chiamata come la seguente sarebbe sufficiente?

GetValidators<IDeleteValidator<Whatever>>(); 

risposta

2

non ho abbastanza seguo la domanda (più a causa del mio sonno di ogni altra cosa), ma sei dopo:

var unclosedTyped = type.GetGenericTypeDefinition(); 

? (Vedere docs per dettagli.)

+0

Questo ha risolto il problema esattamente. Grazie. – rheone

Problemi correlati