我遇到一个问题(可能是由于我对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>>();
答案 0 :(得分:2)
我没有完全遵循这个问题(更多是因为我的困倦而不是其他任何事情),但你是否在追求:
var unclosedTyped = type.GetGenericTypeDefinition();
? (有关详细信息,请参阅docs。)