朋友,
鉴于这三个类:
public class MyBaseClass {
}
public class MyDerivedClass1: MyBaseClass {
}
public class MyDerivedClass2: MyBaseClass {
}
在运行时,我将有一个MyBaseClass
类型的对象(可以是MyDerivedClass2
或MyDerivedClass1
)。如何在运行时确定MyBaseClass
是否为MyDerivedClass1
?
答案 0 :(得分:4)
使用is
运算符。
是(C#参考) - 检查对象是否与给定类型兼容。例如,以下代码可以确定对象是MyObject类型的实例,还是从MyObject派生的类型:
如果实例位于继承树中,is运算符将返回true。
if (myInstance is MyDerivedClass1)
{
// my instance is of type MyDerivedClass1
}
这将适用于您的示例代码。 但是如果您想检查是否需要使用typeof()
和GetType()
完全相同的类型。
if (myInstance.GetType() == typeof (MyDerivedClass1))
{
// my instance is of type MyDerivedClass1
}
答案 1 :(得分:1)
1。如果您想确定实例是否完全您应该使用GetType()方法并将其与所需类型进行比较:
bool IsExactlyOfMyDerivedClass2(object instance)
{
if (instance == null)
throw new ArgnumentNullException();
return (instance.GetType() == typeof(MyDerivedClass2))
}
或通用版
bool IsExactlyOf<T>(object instance)
{
if (instance == null)
throw new ArgnumentNullException();
return (object.GetType() == typeof(T))
}
2. 如果你不关心实例是否完全属于给定类型(或者类型是抽象类或接口),那么就像@dknaack指出的那样,使用{{ 3}} C#操作符:
bool IsOfMyDerivedClass2_OrMoreDerived(object instance)
{
if (instance == null)
throw new ArgnumentNullException();
return instance is MyDerivedClass;
}
3。此外,您还可以使用IS类的IsAssignable方法:
bool IsOfMyDerivedClass2_OrMoreDerived(object instance)
{
if (instance == null)
throw new ArgnumentNullException();
return typeof(MyDerivedClass2).IsAssignableFrom(instance.GetType());
}
或通用版本:
bool IsOf_OrMoreDerived<T>(object instance)
{
if (instance == null)
throw new ArgnumentNullException();
return typeof(T).IsAssignableFrom(instance.GetType());
}
答案 2 :(得分:0)
如果您在编译时不知道类型(即您只能访问Type对象),则可以使用Type.IsAssignableFrom(或TypeInfo.IsAssignableFrom,具体取决于您所使用的平台)。
var baseClassType = typeof(BaseClass);
var derivedClassType = typeof(DerivedClass);
var isBaseClass = baseClassType.IsAssignableFrom(derivedClassType);