我在获取泛型的未封闭类型时遇到了问题(可能是由于我对 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 的基类和接口上获取它的类型。这很好用,但是我想清理我的代码并以比上面更通用的形式完成此操作
知道 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>>();
或者是否可以进一步改进我的方法,以便像下面这样的调用就足够了?
GetValidators<IDeleteValidator<Whatever>>();