C#超类和子类中的反射

时间:2014-08-07 13:13:34

标签: c# object inheritance reflection system.reflection

朋友,

鉴于这三个类:

public class MyBaseClass {
}

public class MyDerivedClass1: MyBaseClass {
}

public class MyDerivedClass2: MyBaseClass {
}

在运行时,我将有一个MyBaseClass类型的对象(可以是MyDerivedClass2MyDerivedClass1)。如何在运行时确定MyBaseClass是否为MyDerivedClass1

3 个答案:

答案 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);