如何判断一个对象是否派生自特定的类

3

有人要求我提供更多信息:下面是原始问题:

我看到了上面指向的答案。在发布之前,我确实进行了搜索。这就是我发现 .IsSubclassOf 的方式(我对 C# 非常陌生)。

我不明白为什么在尝试使用该命令时会出现错误。

我需要能够判断某个对象 O 是否是某个其他类 C 的子类。如果我直接指定类 C 的类型(例如 ListBox),那就没问题了,但是类 O 是什么将会有所不同,这就是为什么我需要检查的原因。O 可能是许多从 ListBox 派生的对象之一,或者它可能是从 TextBox 派生的对象,或者它可能是其他东西。我需要能够处理传递给方法的对象是从 ListBox 或任何 O 可能派生/子类化的对象中派生的情况。

我下面给出的示例代码可以正常工作,如果“st”可以在最后一个语句中起作用。但它不起作用。它给我一个错误。我被告知不能在那里使用变量-必须使用类型。但是变量本身就是一种类型。我在上面将其声明为一种类型。我无法具体命名该类型,因为我不知道对象的类型。我必须使用 GetType 来获取它。


原始问题/帖子:

我需要判断一个对象实例是否派生自特定类。

这只是一些示例代码,用于测试 type of"is a IsSubclassOf" 方法,但它们对我似乎不起作用。

ListBox tb = new ListBox();
NoVerticalScrollCheckedListBox nvlb = new NoVerticalScrollCheckedListBox();
Type st = nvlb.GetType();
Type uType = tb.GetType();
bool b = typeof(st).IsSubclassOf(uType);
Console.Write("BOOL: " + b); 

我得到了一个错误,说我试图将变量“st”用作类型,但是“st”是一种类型。我可以输入实际的类名,例如"NoVerticalScrollCheckedListBox",但这不会给我想要的信息,因为我想要发现的是特定对象实例是否派生自另一个类,而不是该类是否从另一个类抽象派生。
例如,我想要创建一个方法,以相同的方式处理所有从ListBox派生的对象,无论它是几个现有子类型之一还是可能出现的新子类型。

不太清楚你的意思 - 特别是“不确定该类是否抽象派生自另一个类”。你实际上想要确定什么?在编译时有什么信息?考虑到st已经是对Type对象的引用,你期望typeof(st)做什么?我相信你想做的事情是可行的 - 我们只需要正确理解它。(特别是,为什么你想以不同的方式处理ListBox的不同子类?) - Jon Skeet
这里: typeof(st) 不正确,st 已经是一个类型了,您只需使用: st.IsSubClassOf(uType) - Maarten
2个回答

8

使用反射来完成常见任务,这表明有更好的方法可以采用。一个有前途的第一步似乎是:

bool b = nvlb is ListBox;

根据您使用此信息的方式,可能并非必要。您应更详细地描述您的方法的目的。


1
您不能传递要比较的类型的实例。
public class Base{}    
public class Child : Base{}
public class ChildOfChild : Child{}
public class Another{}

//...

bool b1 = typeof(Child).IsSubclassOf(typeof(Base)); //true
bool b2 = typeof(ChildOfChild).IsSubclassOf(typeof(Base)); //true
bool b3 = typeof(Another).IsSubclassOf(typeof(Base)); //false

如果您想检查当前实例,可以使用 as 而不是 is
Child c = new Child();
//...

Base b = c as Base;
if(b != null)
{
    //...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接