我想做以下事情:
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"
}
}
换句话说,我想获得设置成员变量值的类的名称。我该怎么做?
答案 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派生的,我不知道它是如何表现的。