Вы можете проверить это так:
bool DoBothDeriveFrom<TBase, T1, T2>()
{
return typeof(T1).IsSubclassOf(typeof(TBase))
&& typeof(T2).IsSubclassOf(typeof(TBase));
}
IsAssignableFrom
тоже будет работать, если вы предоставите общую базу, глубина иерархии тут не при чем.
Если TBase
неизвестно, вы можете взобраться по деревьям наследования обоих классов, как предложено InBetween. А затем сравните оба дерева, чтобы проверить, имеют ли они общий тип, отличный от object
. Это может выглядеть как-то так:
public bool HaveCommonRoot<T1, T2>()
{
var tree1 = InheritanceTree<T1>();
var tree2 = InheritanceTree<T2>();
return tree1.Intersect(tree2).Any();
}
private IEnumerable<Type> InheritanceTree<T>()
{
var type = typeof(T);
yield return type;
while (type.BaseType != typeof(object))
{
type = type.BaseType;
yield return type;
}
}