超类构造函数将子类名作为字符串获取

本文关键字:字符串 获取 构造函数 子类 超类 | 更新日期: 2023-09-27 18:10:02

这里有一个。我有一个基类来处理所有的异常。基类根据类名从app.config中检索一条消息。因此,如果我有10个异常,那么app.config中就有10条消息。

// EBusinessClassExceptions inherits from ApplicationException
public EBusinessClassExceptions(string msgType, params object[] objects)
  : base(string.Format(exceptionMessagesServices.GetMessage(msgType), objects))
{
}

所以msgType是要查找的异常的类名。

一个示例子类是:

// sub class
public class EHiddenFromWebException : EBusinessClassExceptions
{
  public EHiddenFromWebException(int sampleID)
    : base("EHiddenFromWebException", sampleID)
  {
  }
}

但是我不喜欢的是我必须使用类名作为字符串的方式。所以一个更好的版本是:

// sub class
public EHiddenFromWebException(int sampleID)
  : base(typeof(EHiddenFromWebException).Name, sampleID)
{
}

这样我就不必将类名作为字符串列出,编译器会验证类名。但是如果我有10个异常,每个异常的构造函数都是一样的——它只是这样做:

typeof(thisClass).Name

我想写的只是:

// sub class
public EHiddenFromWebException(int sampleID)
  : base(sampleID)
{
}

并且在父构造函数中有typeof。但是要做到这一点,父构造函数必须确定子类的类名。这就是我被困住的地方……

如果这是一个实例方法,我可能会使用这个,但我卡住了,因为它是一个构造函数。

编辑-注意你不能从内部使用"this":base(),我认为我需要调用父构造函数

超类构造函数将子类名作为字符串获取

你不能在base()中使用this,但是你可以覆盖Message属性。

public class EBusinessClassExceptions : ApplicationException
{
    public override string Message
    {
        get
        {
            return this.GetType().ToString();
        }
    }
}

这将为您工作。从基类的构造函数中的获取派生类的名称。

public class EBusinessClassExceptions
    {
        public EBusinessClassExceptions(int sampleID)
        {
            Type type = GetType();
            string name = type.Name;
            Console.WriteLine("Im gonna get an exception message for {0} with sample {1}", name, sampleID);
        }
    }
    public class EHiddenFromWebException : EBusinessClassExceptions
    {
        public EHiddenFromWebException(int sampleID) : base (sampleID)
        {
        }
    }
    public static void Main()
    {
        EHiddenFromWebException ex = new EHiddenFromWebException(123);       
    }