Получение незакрытого типа универсального типа, закрывающего универсальный тип

У меня возникла проблема (вероятно, из-за того, что я не знаком с дженериками 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>>();

person rheone    schedule 07.11.2012    source источник


Ответы (1)


Я не совсем понял вопрос (скорее из-за моей сонливости, чем из-за чего-либо еще), но вы после:

var unclosedTyped = type.GetGenericTypeDefinition();

? (Подробности см. в документах.)

person Jon Skeet    schedule 07.11.2012