К каким строго типизированным свойствам вы пытаетесь получить доступ? Если они строго типизированы, потому что они являются входными типами универсального, вы не сможете получить к ним доступ, не предоставив типы в цикле foreach. Если они строго типизированы, но не связаны с предоставленными типами, можете ли вы переместить их в класс IRelation?
Это будет иметь больше смысла с примером кода - скажем, что ваши классы примерно такие:
public IRelation
{
public string RelationshipType { get; set; }
}
public IGenericRelation<TParent, TChild> : IRelation
{
public TParent Parent { get; set; }
public TChild Child { get; set; }
}
Если ваш список содержал одну IGenericRelation<Foo, Bar>
и одну IGenericRelation<Fizz, Buzz>
, вы не можете перечислить и получить оба обратно, не зная, какой конкретный тип вы ищете:
//Theoretical, non-compiling example....
foreach (IGenericRelation<,> relationControl in this.uiPlhControls.Controls.OfType<IGenericRelation<,>>)
{
//This wouldn't work for type IGenericRelation<Fizz, Buzz>
relationControl.Parent.FooProperty = "Wibble";
//You would be able to access this, but there is no advantage over using IRelation
relationControl.RelationshipType = "Wibble";
}
(Обратите внимание, что мне также пришлось изменить типlationControl в foreach из кода вашего примера, чтобы возможное использование имело некоторый смысл.)
По сути, полезно думать о дженериках .NET так же, как о шаблонных классах C ++ (я знаю, что реализация отличается, но эффект в этом отношении тот же). Представьте, что во время компиляции весь ваш код проверяется на предмет использования класса IGenericRelation, и создаются конкретные неуниверсальные классы, выполняя поиск по ключевым словам TParent и TChild и заменяя их запрошенным типом. Поскольку два созданных класса являются такими же отдельными, как и любые два других класса .NET, нет смысла запрашивать «все классы, которые начинались как этот шаблон», лучшее, что вы можете сделать, - это найти общий базовый класс или интерфейс - в этом случае IRelation.