В С# можно ли ограничить параметр типа универсального метода таким образом, чтобы он ограничивался незакрытым типом интерфейса безопасным способом? Позвольте мне уточнить...
Например, у меня есть следующий псевдокод:
public bool Validate<TValidator>(object validatable)
where TValidator : IValidator<>
{
// code that finds all implementations of IValidator that closes on
// recursive base types / interfaces of the validatable object
// return true if validates
}
У меня есть несколько интерфейсов, реализующих IValidator, таких как ICreateValidator и IDeleteValidator. Я могу достаточно легко собрать валидаторы, которые мне нужны, в тяжелом отражении, не столь общем, как хотелось бы, таким образом, чтобы он закрывался для всех типов T и всех базовых классов T, а также интерфейсов, реализованных T.
Желание было бы в состоянии назвать что-то вроде строк
var validates = Validate<IDeleteValidator<>>(concreteDomainObject);
Что дало бы мне незакрытый тип IDeleteValidator‹>, позволяющий мне внутренне находить каждую реализацию IDeleteValidaor, где T — либо конкретный типDomainObject, либо интерфейс, который реализует конкретный типDomainObject, либо рекурсивные базовые типы, конкретный типDomainObject расширяется до объекта. .
Конечно, я мог бы закрыть интерфейс объекта домена, просто для меня не имеет смысла вызывать
Type unclosedValidatorType = typeof (TValidator).GetGenericTypeDefinition()
Учитывая, что я не мог быть уверен, что TValidator будет общим типом во время компиляции, и что явно закрытый TValidator не будет использоваться, кроме как для удаления его закрывающего типа, это кажется мне неправильным способом делать что-то.
Предоставленный мной псевдокод, очевидно, работает, но существует ли безопасный тип, эквивалентный типу универсального метода для незакрытого типа данного интерфейса?
отредактировано, чтобы исправить некоторые термины
where TValidator : IValidator<TValidator>
? - person Wutz   schedule 28.11.2012public bool Validate(object validatable, Type validatorType)
иvar validates = Validate(concreteDomainObject, typeof(IDeleteValidator<>));
? - person phoog   schedule 28.11.2012