C# Checking if a class is X, OR inherited from X
我对C相当陌生,我尽力找到一个与我相似的已回答问题,但我无法得到与我的问题相关的答案。
所以,我有一个"实例"类,它应该是所有游戏对象的超级类。它具有只读类名属性,定义如下:
1 2 3 4 5 6 7
| public string ClassName
{
get
{
return this.GetType().Name;
}
} |
我提出这个问题的原因是,我希望使用以下方法:如果当前对象是ClassName的实例,或者如果对象的类继承自ClassName,则返回true。
1 2 3 4
| public bool IsA(string className)
{
//TODO
} |
这需要有点"递归",因此如果情况是:X:等级1:等级2:等级4那么x.isa(第4类)将返回true
我研究过object.getType()这样的方法,但还没有找到解决方案。
有什么想法吗?
- 这需要有点"递归",以便如果情况是:x:class1:class2:class4,那么x.isa(class4)将返回true。
- 取自复制线程中接受的答案:如果一个实例在继承树中,那么is返回true。相关文件:IS(C参考)。
- 是的,我也读过,但有一个问题仍然存在,我的参数是字符串而不是类
- 如果你在这里用绳子,你就进入了危险的水域。你确定你被绳子卡住了吗?如果你告诉我们绳子是从哪里来的,我们可以建议一个更干净的替代品。
- gist.github.com/elmuti/e09b066207eef0b551f0df6f56ce48f4我是根据链接的副本编写的,但我不确定这是否有效。
- 只是修正了要点,但我不确定它是否适合我的需要
- 我认为更好的问题是为什么要用一个字符串开始?您的class name属性/isa方法除了重复已经可用的语言功能外没有任何作用,而且您甚至没有使用完整的类型名,因此您的重新实现无法区分两个不同命名空间中的同一类名。如果您需要将对象的类型打印到用户/a日志文件中,当然,请转到并获取该名称,但不要以编程方式使用该名称,请使用专门用于解决这些问题的语言功能。
只需使用is或as语句。as将尝试将其强制转换到目标,如果失败(从内存中),则为空。
下面是一个快速的linqpad演示(用vs的Console.Out.Write("yep");替换"yep".Dump()"):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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继承自foo继承的类,那么"b is foo"是否也选中?
- @用户3524922什么阻止您首先检查文档?
- 问题是,参数是字符串而不是类
- @用户3524922参数是字符串是什么意思?
- @梅森补充说,这不是真正需要的,因为江户十一〔一〕很可能是他想要的。只有他说是弦…所以我们拭目以待。