c# - 需要检查两个 View 模型的类型以查看它们是否源自同一基础

标签 c# reflection types

我遇到一种情况,我需要查看两个 View 模型是否源自同一基础。

型号:

class BaseModel;
class DerivedModel1 : BaseModel;
class DerivedModel2 : BaseModel;
class DerivedModel3 : DerivedModel2;

鉴于此模型,我想知道 DerivedModel1DerivedModel3 何时都来自同一个 BaseModel。不能保证这些类位于同一个程序集中,并且可能存在更深的层次结构。也不能保证我知道 BaseModel 是什么。

我已经尝试过 DerivedModel1.GetType().IsAssignableFrom(DerivedModel3.GetType()); 但正如您所知,由于层次结构的深度,这不会起作用。

有什么想法吗?

最佳答案

你可以这样检查:

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

IsAssignableFrom 也可以工作,如果您提供公共(public)基础,层次结构深度与此处无关。

如果 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;
    }
}

关于c# - 需要检查两个 View 模型的类型以查看它们是否源自同一基础,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915932/

相关文章:

c# - 格式化包含数字/日期的字符串变量以在 C# 中打印

c# - Star - 使用正则表达式在字符串中查找字符 *

java - Object.class.getName() 慢吗?

haskell - 类型解构

c# - 输入来自 InvalidCastException 的数据

c# - 数组和数据表之间的区别?

c# - Microsoft Visual Studio 2012 无法在 c# 文件中设置断点

java - 如何使用 ClassLoader 或 Class 以编程方式加载类

java - 二进制搜索方法数组Java

types - SPARQL:如何列出和计算 RDF 数据集中的每种数据类型?