2012-11-07 64 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