2016-12-02 3 views
-1

типа класса я хотел бы сделать следующее:Определение в виртуальной функции

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" 
    } 
} 

Другими словами, я хотел бы получить имя класса, в котором устанавливается значение переменной-члена. Как мне это сделать?

+1

'_Name =" A "', no? –

+0

Нет, когда вы вызываете 'f()' из экземпляра 'C', вы получите« C »для имени типа. – rashmatash

+0

'protected virtual void f() {...}'? поскольку по умолчанию это 'private virtual void f() {...}' –

ответ

1

Я woudn't сказать this.GetType().Name, я бы сказал typeof(A).Name и в классе B typeof(B).Name

так что каждый класс, который переопределяет метод sould сказать typeof(classname).Name

1

Самый простой soloution это:

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; 
} 

Я еще не проверил этот код, возможно, он не работает должным образом для структур.

EDIT: На самом деле, вы никак не можете получить структуру, так что это должно сработать для них. Однако перечисления выводятся из байт/short/int/long, я не знаю, как они себя ведут.

+0

Вы не можете наследовать структуры в любом случае. –

+0

Да, правильно. отредактирует ответ – georch

+0

В последнем примере, если люди входят с типом 'struct' или' enum', они получат 'typeof (System.ValueType)' в качестве возвращаемого значения. –

Смежные вопросы