我正在尝试编写验证来检查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 的任何类。
似乎是一个简单的问题,但我似乎无法弄明白。
答案 0 :(得分:24)
这个怎么样:
MyObject myObject = new MyObject();
Type type = myObject.GetType();
if(typeof(YourBaseObject).IsAssignableFrom(type))
{
//Do your casting.
YourBaseObject baseobject = (YourBaseObject)myObject;
}
这告诉您该对象是否可以转换为该特定类型。
答案 1 :(得分:7)
我认为您需要重申您的条件,因为如果obj
是Derived
的实例,它也将是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