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

时间:2014-06-22 23:03:36

标签: c# class inheritance constructor

这是一个。我有一个基类用于我的所有异常。基类从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()

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

这对你有用。从 inside 基类的构造函数中获取派生类的名称。

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

    }