2012-11-07 85 views
6

我遇到了一個問題(可能是由於我對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的基類和接口上獲取它的類型爲closed。這個偉大的工程,但是我想清理我的代碼和一個更通用的形式大於上述

知道的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>>(); 

或通話iginal方法,纔有可能改進我的方法更何況像以下就足夠了一個電話?

GetValidators<IDeleteValidator<Whatever>>(); 

回答

2

我不太明白的問題(更由於我睡意比什麼都重要),但你以後:

var unclosedTyped = type.GetGenericTypeDefinition(); 

? (有關詳細信息,請參見docs。)

+0

這正好解決了問題。謝謝。 – rheone