引用抽象类中的继承类

时间:2010-10-29 20:15:36

标签: c# .net inheritance

有没有办法引用继承抽象类的类(即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 个答案:

答案 0 :(得分:7)

使用GetType()方法。它是虚拟的,所以它会表现多态。

Type WhatAmI {
  get { return this.GetType(); }
}

答案 1 :(得分:2)

看起来你只是想要获得上述两种答案都能提供的类型。从您提出问题的方式来看,我希望Monster没有任何依赖于吸血鬼的代码。这听起来像是违反Dependency Inversion Principle的一个例子,并导致更脆弱的代码。

答案 2 :(得分:0)

您不需要Monster.WhatIAm属性。 C#有“是”运算符。

答案 3 :(得分:0)

您还可以使用以下代码段直接从继承的类(Vampire)获取基类信息:

 Type type = this.GetType();     
 Console.WriteLine("\tBase class = " + type.BaseType.FullName);