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>>();
这正好解决了问题。谢谢。 – rheone