【问题标题】:How can I tell if one object is derived from a particular class如何判断一个对象是否派生自特定类
【发布时间】:2015-11-17 06:56:57
【问题描述】:

我被问到更多信息:原来的问题在下面

我看到了上面指出的答案。我发帖前确实看过。这就是我如何找到我不知道存在的.IsSubclassOf(我对C# 非常陌生)。

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

我需要能够判断某个对象O是否是某个其他类C的子类。如果我直接指定类C的类型是可以的(例如ListBox)但是@987654325是什么类@ 会有所不同,这就是我需要检查的原因。 O 可能是从ListBox 派生的许多对象之一,也可能是从TextBox 派生的对象,也可能是其他对象。我需要能够对那些传递方法的情况采取行动,这些对象是从 ListBox 派生或子类或任何可能或可能不会从 /p> 派生/子类的 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 的不同子类?)
  • 这个:typeof(st) 不正确,st 已经是一个类型,你可以直接使用:st.IsSubClassOf(uType)

标签: c# subclass typeof


【解决方案1】:

对常见任务使用反射是一个很好的指标,表明有更好的方法。一个有希望的第一步似乎可能是:

bool b = nvlb is ListBox;

不过,根据您使用这些信息的方式,即使这样也可能没有必要。您应该更详细地描述您的方法的目的。

【讨论】:

    【解决方案2】:

    您不能传递您正在比较的类型的实例。

    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)
    {
        //...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2012-10-16
      相关资源
      最近更新 更多