C# 以字符串形式获取子类名称的超类构造函数

C# 以字符串形式获取子类名称的超类构造函数,c#,class,inheritance,constructor,C#,Class,Inheritance,Constructor,这里有一个。我的所有异常都有一个基类。基类从app.config检索基于类名的消息。因此,如果我有10个例外,我在app.config中有10条消息 // EBusinessClassExceptions inherits from ApplicationException public EBusinessClassExceptions(string msgType, params object[] objects) : base(string.Format(exceptionMessage

这里有一个。我的所有异常都有一个基类。基类从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(),我认为我需要调用父构造函数,这将适用于您。从基类的构造函数内的获取派生类的名称

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

    }

确实,您不能在
base()
中使用
this
,但您可以重写消息属性

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

奇怪的是,重复出现的模板模式可能是您的最佳选择。您可以在基类构造函数中使用
this.GetType()
来获取派生类型,但它将在运行时解析,这将给您带来一点性能开销。我恐怕无法在内部使用:base()。嘿,谢谢-但是我如何调用父类构造函数呢?必须从内部:Base我想在哪里不能使用它?为什么需要调用父类构造函数?这是一个godo问题。EBusinessClassException的父类是ApplicationException——因此通过调用实际引发异常的构造函数。如果我使用你的想法,我将不得不明确地从那里抛出异常,我想-我会看一看。谢谢,我不这样做。这会起作用的。我必须从异常构造函数内部抛出一个异常,这将是对我自己的递归调用。我认为……最简单的方法是@qxg建议重写虚拟消息属性。我这样做了,而且效果很好。不管怎样,谢谢。啊哈-既然我喜欢……我就试试看。谢谢