2012-11-07 24 views
6

Kapsanan bir genel tür elde etme konusunda bir sorun yaşıyorum (muhtemelen C# generics hakkında bilgi sahibi olmadığım için). Kullanımdaki açık validator arabirimi dışında aşağıdakilere oldukça benzeyen birkaç yönteme sahibim. diyor ve tüm baz türleri ve belirli bir türden arayüzleri toplar olarakBir genel tür kapatılmamış türden bir genel türünü kapatılıyor

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

yöntem GetRecursiveBaseTypesAndInterfaces yapar. Sonuçta yaptığım şey, açık validator arayüzünün kapatılmamış tipini almak ve orijinal tip T'nin temel sınıflarının ve arayüzlerinin her birinin kapalı olarak tipini almaktır. Bu harika çalışıyor, ancak benim kod temizlemek ve T herhangi doğrulayıcı IValidator (feryat) uzatacaktır bilerek yukarıda

daha genel bir formda

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

Benim bu başarmak istiyorum gibi yukarıdaki yöntemin genel bir sürümü de tamamlanmamış girişimi görünür:

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

nasıl unclosedType define (veya yöntemi yeniden) ile aynı işi yapmak için yoksa veya

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

Veya bir çağrıda bulunan iginal yöntem yeterli olacaktır aşağıdaki gibi bir çağrısı olarak daha çok benim yöntemini geliştirmek için mümkün olurdu?

GetValidators<IDeleteValidator<Whatever>>(); 

cevap

2

Oldukça (nedeniyle her şeyden daha benim uykululuk daha) soru takip etmedi, ancak sonra şunlardır:

var unclosedTyped = type.GetGenericTypeDefinition(); 

? (Ayrıntılar için docs'a bakın.)

+0

Sorun tam olarak çözüldü. Teşekkürler. – rheone

İlgili konular