Определите метод в базовом классе, который возвращает свое имя (используя отражение) - подклассы наследуют это поведение - PullRequest
5 голосов
/ 17 июня 2010

В C #, используя отражение, возможно ли определить метод в базовом классе, который возвращает свое собственное имя (в форме строки) и подклассы наследуют это поведение полиморфным способом?

Дляпример:

public class Base
{
    public string getClassName()
    {
        //using reflection, but I don't want to have to type the word "Base" here.
        //in other words, DO NOT WANT  get { return typeof(Base).FullName; }
        return className; //which is the string "Base"
    }
}

public class Subclass : Base
{
    //inherits getClassName(), do not want to override
}

Subclass subclass = new Subclass();
string className = subclass.getClassName(); //className should be assigned "Subclass"  

1 Ответ

6 голосов
/ 17 июня 2010
public class Base
{
    public string getClassName()
    {
        return this.GetType().Name;
    }
}

на самом деле, you don't need to create a method getClassName() just to get the type-name. Вы можете вызвать GetType () для любого объекта .Net, и вы получите метаинформацию типа.

Вы также можете сделать это так,

public class Base
{

}

public class Subclass : Base
{

}

//In your client-code
Subclass subclass = new Subclass();
string className = subclass.GetType().Name;

EDIT

Более того, если вам действительно необходимо определить getClassName () в любом случае, я настоятельно рекомендую сделать его свойством [в соответствии с рекомендациями по проектированию структуры .net Framework), поскольку поведение getClassName () не является динамическим он всегда будет возвращать одно и то же значение каждый раз, когда вы его вызываете.

public class Base
{
    public string ClassName
    {
        get
        {
            return this.GetType().Name;
        }
    }
}

EDIT2

Оптимизированная версия После прочтения комментария от Криса.

public class Base
{
    private string className;
    public string ClassName
    {
        get
        {
            if(string.IsNullOrEmpty(className))
                className = this.GetType().Name;
            return className;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...