【问题标题】:C# Checking if a class is X, OR inherited from X [duplicate]C#检查一个类是否是X,或者从X继承[重复]
【发布时间】:2017-03-03 04:56:25
【问题描述】:

我是 C# 的新手,我尽我所能找到一个与我类似的已经回答的问题,但我就是找不到与我的问题相关的答案。

所以, 我有一个“实例”类,它应该是所有游戏对象的超类。 它有一个只读的 ClassName 属性,定义如下:

    public string ClassName
    {
        get
        {
            return this.GetType().Name;
        }
    }

我提出这个问题的原因是,如果当前对象是 className 的实例,或者对象的类继承自 className,我希望使用以下方法返回 true。

    public bool IsA(string className)
    {
        //TODO
    }

这需要某种“递归”,以便如果情况是: X : Class1 : Class2: Class4 那么 X.IsA(Class4) 将返回 true

我已经研究过 object.GetType() 之类的方法,但我还没有找到解决方案。

有什么想法吗?

【问题讨论】:

  • 这需要是“递归”的,这样如果情况是: X : Class1 : Class2: Class4 那么 X.IsA(Class4) 将返回 true
  • 取自重复线程中接受的答案:如果实例在 继承树中,is 返回 true 相关文档:is (C# Reference).
  • 是的,我也刚读过,但一个问题仍然存在,我的参数是字符串而不是类
  • 如果您在此处使用字符串,您将进入危险水域。你确定你被字符串卡住了吗?如果您向我们展示字符串的来源,我们可能会提出更简洁的替代方案。
  • gist.github.com/Elmuti/e09b066207eef0b551f0df6f56ce48f4 我是根据链接的副本写的,但我不确定这是否可行

标签: c# oop inheritance multiple-inheritance


【解决方案1】:

只需使用isas 语句。 as 将尝试将其强制转换为目标,如果失败则为 null(从内存中)。

这是一个快速的 linqpad 演示(在 VS 中将 "yep".Dump()" 替换为 Console.Out.Write("yep");):

void Main()
{
    var  b = new bar();

    if (b is foo)
        "yep".Dump();
    else
        "nope".Dump();

    var b2 = new bar();
    var b3 = b2 as foo;
    // you can check if b3 is null, or if not, use it a foo.

}


class foo {}

class bar : foo {}

【讨论】:

  • 你说要使用as,但没有在使用中显示。
  • “b is foo”是否也检查,例如 b 是否从 foo 继承的类继承?
  • @user3524922 是什么阻止您首先检查文档?
  • 问题是,参数是字符串而不是类
  • @user3524922 参数是字符串是什么意思?
猜你喜欢
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2011-08-03
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多