【问题标题】:c# test if a class is a subtype of another classc# 测试一个类是否是另一个类的子类型
【发布时间】:2016-07-05 16:41:54
【问题描述】:

这看起来很像我发表的另一篇文章,但我正在用 C# 编写一个类似的程序。 我有卡片类和土地类,它是卡片的子类。在 Java 中,我使用 instanceof 来确定它是否是 Card 的孩子。 被引用的对象保存在变量c 我已经试过了:

if (typeof (Land).isSubClassOf(typeof(Card))){
//random code
}

我想要在 java 中做的是:

if ( c instanceof Land){
}

【问题讨论】:

  • YourObject.GetType.IsAssignableFrom(YourParentClass.GetType());
  • 我认为您的问题造成了一些混乱,这就是为什么您会得到完全不同的答案。您是否有一个 object 并且您想知道该对象是否属于 Card 类型或其子类之一,或者您是否有一个 Type 并且您想知道该类型是否为另一种类型的子类型?
  • @Lapious 我还没有,但是在尝试时,它并没有按照我需要的方式工作
  • @ScottHannen 我有一个对象,经过测试,标记的答案是唯一能按照需要的方式工作的答案。

标签: c# inheritance


【解决方案1】:
if(foo is Bar) {
    return (Bar)foo;
}

【讨论】:

    【解决方案2】:

    对于直接继承:

    static void Main(string[] args)
    {
        Land c = new Land();
        bool isCard = c.GetType().IsSubclassOf(typeof(Card));
    }
    

    或者:

    static void Main(string[] args)
    {
        Land c = new Land();
        bool isCard = c is Card;
    }
    

    【讨论】:

    • 我尝试了我看到的所有其他方法,但没有任何效果。非常感谢@user3185569
    • 这个答案的主要问题是: Card 有几个后代(Land、Spell 等),在使用的方法中,我传递了一个 Card 对象。如果我使用此方法测试卡是否为土地,当我想要查看卡是否为土地时,isCard 将始终为真
    【解决方案3】:

    不要检查类型和 then 强制转换。如果你这样做,你实际上是在检查类型两次。这样做:

    var l = c as Land;
    

    如果c 可以转换为Land,那么l 将包含它。如果不是,它将是null

    如果你这样做:

    if(c is Land)
        l = (Land)c;
    

    那么你实际上是在检查c 两次。一次检查它是否为Land 类型,然后再次进行实际转换。

    C# As keyword

    【讨论】:

    • 检查在 if 语句中间,因此像这样进行转换会导致错误说我不能将 Land 隐式转换为 bool
    • 使用此方法有效,主要是因为我忘记了我已经声明了一个变量来保存 Card 的类型,因此通过直接检查该变量,我能够安全地进行转换。当其他类型的卡开始进入该计划时,情况就不同了
    • 如果我们只是进行布尔检查,这并不重要——它是给定的类型吗?但是 99% 的情况下,如果我们需要知道 if 它是某种类型,那么我们将需要强制转换为该类型。这就是as 的用武之地,因为我们避免检查然后强制转换。
    猜你喜欢
    • 2011-05-31
    • 2011-02-27
    • 2015-02-13
    • 2010-10-21
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多