Ссылка на наследующий класс из абстрактного класса - PullRequest
3 голосов
/ 30 октября 2010

Есть ли способ сослаться на класс (т.е. Type), который наследует абстрактный класс?

class abstract Monster
{
    string Weakness { get; }
    string Vice { get; }

    Type WhatIAm
    {
        get { /* somehow return the Vampire type here? */ }
    }
}

class Vampire : Monster
{
    string Weakness { get { return "sunlight"; }
    string Vice { get { return "drinks blood"; } }
}

//somewhere else in code...
Vampire dracula = new Vampire();
Type t = dracula.WhatIAm; // t = Vampire

Для тех, кому было любопытно ... что я делаю: я хочу знать, когда мой сайт был в последний раз опубликован. .GetExecutingAssembly работал отлично, пока я не взял dll из своего решения. После этого BuildDate всегда была последней датой сборки утилиты dll, а не dll веб-сайта.

namespace Web.BaseObjects
{
    public abstract class Global : HttpApplication
    {
        /// <summary>
        /// Gets the last build date of the website
        /// </summary>
        /// <remarks>This is the last write time of the website</remarks>
        /// <returns></returns>
        public DateTime BuildDate
        {
            get
            {
                // OLD (was also static)
                //return File.GetLastWriteTime(
                //    System.Reflection.Assembly.GetExecutingAssembly.Location);
                return File.GetLastWriteTime(
                    System.Reflection.Assembly.GetAssembly(this.GetType()).Location);
            }
        }
    }
}

Ответы [ 4 ]

7 голосов
/ 30 октября 2010

Используйте метод GetType(). Это виртуально, поэтому оно будет вести себя полиморфно.

Type WhatAmI {
  get { return this.GetType(); }
}
2 голосов
/ 30 октября 2010

Похоже, вы просто ищете тип, который хорошо дают оба приведенных выше ответа.Из того, как вы задали вопрос, я надеюсь, что у Monster нет кода, который зависит от вампира.Похоже, это будет примером нарушения принципа обращения зависимостей и приведет к более хрупкому коду.

0 голосов
/ 30 октября 2010

Вы также можете получить информацию о базовом классе непосредственно из унаследованного класса (Vampire), используя следующий фрагмент:

 Type type = this.GetType();     
 Console.WriteLine("\tBase class = " + type.BaseType.FullName);
0 голосов
/ 30 октября 2010

Вам не нужно свойство Monster.WhatIAm.В C # есть оператор "is".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...