确定虚函数中的类类型

时间:2016-12-02 10:45:49

标签: c# inheritance

我想做以下事情:

class A {
    protected string _Name;
    protected virtual void f(){ _Name = GetType().Name; // _Name is "A" }
}
class B : A {
    // No override for f() hier.
}
class C : B {
    protected void override f()
    {
       base.f(); // _Name is "C", but I want to get
       // the class name in which _Name is actually set, i.e. "A"
    }
}

换句话说,我想获得设置成员变量值的类的名称。我该怎么做?

2 个答案:

答案 0 :(得分:1)

我不会说this.GetType().Name,我会说typeof(A).Name而是在B级 typeof(B).Name

所以每个覆盖该方法的类都应该说typeof(classname).Name

答案 1 :(得分:1)

最简单的解决方法就是:

class A 
{
    protected string _Name;
    protected virtual void f() { 
        _Name = typeof(A).Name; //or nameof(A)
    }
}

如果由于某种原因想要更加花哨,并且想要获得任何类的基本类型,可以使用如下方法:

public static Type GetBaseType(Type type)
{
    Type currentType = type;
    while(currentType.BaseType != typeof(object) 
       && currentType.BaseType != null)
    {
        currentType = currentType.BaseType;
    }
    return currentType;
}

我没有检查过这段代码,可能是因为结构不能正常工作。

编辑:实际上,无论如何都无法从结构中派生出来,所以它应该适用于它们。但是,枚举是从byte / short / int / long派生的,我不知道它是如何表现的。