c# - 检索关闭泛型类型的泛型类型的未封闭类型

标签 c# generics generic-programming

我在获取泛型的未封闭类型时遇到问题(可能是由于我对 C# 泛型不熟悉)。除了使用的显式验证器接口(interface)外,我有几种方法看起来与以下方法非常相似。

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 方法按照它所说的那样收集所有基类型和给定类型的接口(interface)。所以我最终要做的是获取显式验证器接口(interface)的未封闭类型,并在每个原始类型 T 的基类和接口(interface)上将其类型设为封闭。这很好用,但是我想清理我的代码并以比上面更通用的形式完成它

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

最佳答案

我没有完全理解这个问题(更多是由于我困倦而不是其他原因),但你在追寻:

var unclosedTyped = type.GetGenericTypeDefinition();

? (有关详细信息,请参阅 docs。)

关于c# - 检索关闭泛型类型的泛型类型的未封闭类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280294/

相关文章:

c# - 如何从另一个页面获取数据

c# - Windows.UI.Xaml.Application.Start方法解释

c# - 笛卡尔积或 2 个大文本文件的最佳方法

c++ - 在 C++ 中提取另一个泛型类型的泛型类型

C++ 从类指针调用构造函数?

generic-programming - Agda中的Arity泛型编程

c# - 取一个ref参数的地址

generics - 传递 map 功能时类型推断不起作用

java - 如何从 Generic 获取特定的返回类型

c# - 如何将 List<T> 初始化为给定大小(相对于容量)?