C# 以字符串形式获取子类名称的超类构造函数
这里有一个。我的所有异常都有一个基类。基类从app.config检索基于类名的消息。因此,如果我有10个例外,我在app.config中有10条消息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
// 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建议重写虚拟消息属性。我这样做了,而且效果很好。不管怎样,谢谢。啊哈-既然我喜欢……我就试试看。谢谢