Как мне определить список типов (List<Type>), где я хочу ограничить типы в этом списке типами, которые реализуют интерфейс или базовый класс?
Для очень упрощенного примера того, чего я хочу достичь, у меня есть абстрактный класс Foo со многими различными дочерними классами FooA, FooB, FooC, FooD и т. д. Затем у меня есть еще один класс BarAD со списком разрешенных Foo типов (FooA и FooD) для некоторых операций. Тогда произойдет что-то вроде следующего:
public class BarAD
{
private List<Type> fooTypes;
public BarAD()
{
fooTypes = new List<Type>() { typeof(FooA), typeof(FooD) };
}
public void Execute(Foo obj)
{
foreach (var fooType in fooTypes)
{
if (obj is fooType)
obj.DoSomething();
}
}
}
Как это сейчас работает, я могу использовать любой тип в моем списке. Какой-то метод может добавить String или Integer в качестве типов в список, и код будет компилироваться и работать нормально, что немного усложняет мою жизнь в будущем. Что возвращает меня к вопросу: каким-либо образом ограничить мой List<Type>, чтобы принимать только типы, которые являются дочерними элементами класса Foo?
Type— это класс .NET, и он применим ко всем типам. Вы можете ограничить это во время выполнения, используя отражение. Проверьте здесь - person Chetan Ranpariya   schedule 18.11.2019IsAssignableFromв типеType. - person Enigmativity   schedule 18.11.2019var derived = this.GetType().Assembly.GetTypes().Where(x => typeof(Foo).IsAssignableFrom(x)).ToList();. - person Enigmativity   schedule 19.11.2019