C# 需要检查两个ViewModel的类型,以查看它们是否来自同一基础

C# 需要检查两个ViewModel的类型,以查看它们是否来自同一基础,c#,reflection,types,C#,Reflection,Types,在这种情况下,我需要查看两个ViewModel是否来自同一个基础 型号: class BaseModel; class DerivedModel1 : BaseModel; class DerivedModel2 : BaseModel; class DerivedModel3 : DerivedModel2; 考虑到这个模型,我想知道DerivedModel1和DerivedModel3何时都来自同一个BaseModel。不能保证这些类在同一个程序集中,而且可能还有更深层的层次结构。也不能保

在这种情况下,我需要查看两个ViewModel是否来自同一个基础

型号:

class BaseModel;
class DerivedModel1 : BaseModel;
class DerivedModel2 : BaseModel;
class DerivedModel3 : DerivedModel2;
考虑到这个模型,我想知道
DerivedModel1
DerivedModel3
何时都来自同一个
BaseModel
。不能保证这些类在同一个程序集中,而且可能还有更深层的层次结构。也不能保证我知道什么是BaseModel

我尝试了
DerivedModel1.GetType().IsAssignableFrom(DerivedModel3.GetType())

有什么想法吗?

你可以这样检查:

bool DoBothDeriveFrom<TBase, T1, T2>()
{
    return typeof(T1).IsSubclassOf(typeof(TBase))
        && typeof(T2).IsSubclassOf(typeof(TBase));
}

为什么不使用
Type.IsSubClassOf
方法?我不确定对于深层层次结构级别,该方法是否会返回
true
(我认为它会返回,但目前无法检查),或者如果指定的类型是即时基类型,它是否只会返回
true
。尽管如此,实现一个循环算法来不断检查层次结构树还是很容易的,直到您到达基本类型
对象

还有一件事:您没有正确使用
IsAssignableFrom
。无论如何,它应该是:

BaseModel.GetType().IsAssignableFrom(DerivedModel3.GetType());

DerivedModel3
DerivedModel1
不可分配,因为它们之间没有任何关系。最近的公共根是
BaseModel

您基本上需要类型层次结构中最大的公共基类型

下面是一些代码:

void Main()
{
    var t1 = typeof(DerivedModel1);
    var t3 = typeof(DerivedModel3);

    var t1Hierarchy = new LinkedList<Type>();
    var t3Hierarchy = new LinkedList<Type>();
    getHierarchy(t1, t1Hierarchy);
    getHierarchy(t3, t3Hierarchy);

    var pairs = t1Hierarchy.Zip(t3Hierarchy, Tuple.Create);
    var common = pairs.TakeWhile(p => p.Item1 == p.Item2);
    var gcd = common.LastOrDefault();
}

void getHierarchy(Type t, LinkedList<Type> bases)
{
    var baseType = t.BaseType;

    if (baseType == null)
    {
        return;
    }

    bases.AddFirst(baseType);
    getHierarchy(baseType, bases);
}

class BaseModel {}
class DerivedModel1 : BaseModel {}
class DerivedModel2 : BaseModel {}
class DerivedModel3 : DerivedModel2 {}
void Main()
{
var t1=类型(DerivedModel1);
var t3=类型(DerivedModel3);
var t1Hierarchy=newlinkedlist();
var t3Hierarchy=newlinkedlist();
getHierarchy(t1,t1Hierarchy);
getHierarchy(t3、t3Hierarchy);
var pairs=t1Hierarchy.Zip(t3Hierarchy,Tuple.Create);
var common=pairs.TakeWhile(p=>p.Item1==p.Item2);
var gcd=common.LastOrDefault();
}
void getHierarchy(类型t,LinkedList基)
{
var baseType=t.baseType;
if(baseType==null)
{
回来
}
bases.AddFirst(baseType);
getHierarchy(baseType,bases);
}
类BaseModel{}
类DerivedModel1:BaseModel{}
类DerivedModel2:BaseModel{}
类DerivedModel3:DerivedModel2{}

很抱歉,无法想象
DerivedModel1
DerivedModel3
如何无法从
BaseModel
派生出……真的。。显然,我们知道这个结构。。但我需要一种方法在运行时查看两个类,并确定它们是否“相同类型”。好的,所有类最终都从
object
派生。所有类都有一个公共根,因此您需要以某种方式指定停止的位置。如果您不知道基类,您可以按照InBetween的建议爬上这两个类的继承树。然后比较这两棵树,检查它们是否共享除object以外的任何通用类型。@Snarfblatt:您可以在向上遍历层次结构树时,使用其中一个对象的基本类型重复生成一个列表,然后向上遍历第二个对象层次结构树,直到找到与以前生成的列表匹配的列表。如果唯一匹配的是
object
,则没有“可用”的公共基类。不错,但我的解决方案提供了最大的公共基类类型。@codekaizen:要求检查这些类型是否派生自同一基类,而不是该类是什么。因此,您的解决方案与预期的有点不同。@A.-是的,但可能他确实需要该类型。我的解决方案提供了这个选项。感谢对IsAssignableFrom的澄清,这是我第一次使用它。Snarfblatt基本上想检查类型是否来自同一个基类,与GCD无关。这并不完全清楚,因为他确实提到了
BaseModel
,并且可能实际上关心它。无论哪种方式,我都认为这更有用,因为它可以用于您所说的目的,以及查找最常见的基类型。
void Main()
{
    var t1 = typeof(DerivedModel1);
    var t3 = typeof(DerivedModel3);

    var t1Hierarchy = new LinkedList<Type>();
    var t3Hierarchy = new LinkedList<Type>();
    getHierarchy(t1, t1Hierarchy);
    getHierarchy(t3, t3Hierarchy);

    var pairs = t1Hierarchy.Zip(t3Hierarchy, Tuple.Create);
    var common = pairs.TakeWhile(p => p.Item1 == p.Item2);
    var gcd = common.LastOrDefault();
}

void getHierarchy(Type t, LinkedList<Type> bases)
{
    var baseType = t.BaseType;

    if (baseType == null)
    {
        return;
    }

    bases.AddFirst(baseType);
    getHierarchy(baseType, bases);
}

class BaseModel {}
class DerivedModel1 : BaseModel {}
class DerivedModel2 : BaseModel {}
class DerivedModel3 : DerivedModel2 {}