如何判断实例是某个类型还是任何派生类型

时间:2009-04-16 05:34:38

标签: c# casting types

我正在尝试编写验证来检查Object实例是否可以转换为变量Type。我有一个Type实例,用于他们需要提供的对象类型。但类型可能会有所不同。这基本上就是我想要做的。

        Object obj = new object();
        Type typ = typeof(string); //just a sample, really typ is a variable

        if(obj is typ) //this is wrong "is" does not work like this
        {
            //do something
        }

类型对象本身具有IsSubClassOf和IsInstanceOfType方法。但我真正想要检查的是 obj typ 的实例还是来自 typ 的任何类。

似乎是一个简单的问题,但我似乎无法弄明白。

3 个答案:

答案 0 :(得分:24)

这个怎么样:


    MyObject myObject = new MyObject();
    Type type = myObject.GetType();

    if(typeof(YourBaseObject).IsAssignableFrom(type))
    {  
       //Do your casting.
       YourBaseObject baseobject = (YourBaseObject)myObject;
    }  


这告诉您该对象是否可以转换为该特定类型。

答案 1 :(得分:7)

我认为您需要重申您的条件,因为如果objDerived的实例,它也将是Base的实例。 typ.IsIstanceOfType(obj)将返回true。

class Base { }
class Derived : Base { }

object obj = new Derived();
Type typ = typeof(Base);

type.IsInstanceOfType(obj); // = true
type.IsAssignableFrom(obj.GetType()); // = true

答案 2 :(得分:7)

如果您正在使用Instances,那么您应该选择Type.IsInstanceOfType

  

(返回)如果当前Type为,则为true   在继承层次结构中   由o表示的对象,或者如果是   current Type是o的接口   支持。如果这些都不是假的   条件是这样的,或者如果是   nullNothingnullptra null引用   (在Visual Basic中没有任何内容),或者如果是   current Type是一个开放的泛型类型   (即ContainsGenericParameters   返回true)。 - MSDN

        Base b = new Base();
        Derived d = new Derived();
        if (typeof(Base).IsInstanceOfType(b)) 
            Console.WriteLine("b can come in.");    // will be printed
        if (typeof(Base).IsInstanceOfType(d)) 
            Console.WriteLine("d can come in.");    // will be printed

如果您正在使用Type对象,那么您应该查看Type.IsAssignableFrom

  

(返回)如果是c和当前的Type,则为true   代表相同的类型,或者如果   当前类型在继承中   c的层次结构,或者当前的Type   是一个c实现的接口,或   如果c是泛型类型参数和   当前的Type代表其中一个   约束c。如果没有,则为假   这些条件是真的,或者如果c是   nullNothingnullptra null引用   (在Visual Basic中没有任何内容)。 - MSDN