在C#中调用基础构造函数

如果我从一个基类继承,并希望从继承类的构造函数传递给基类的构造函数,我该怎么做?

例如,

如果我从Exception类继承我想要做这样的事情:

class MyExceptionClass : Exception { public MyExceptionClass(string message, string extraInfo) { //This is where it's all falling apart base(message); } } 

基本上我想要的是能够将字符串消息传递给基类Exception类。

将您的构造函数修改为以下内容,以便正确调用基类构造函数:

 public class MyExceptionClass : Exception { public MyExceptionClass(string message, string extrainfo) : base(message) { //other stuff here } } 

请注意,构造函数不是您可以随时调用某个方法的东西。 这就是在构造函数体中调用错误的原因。

请注意,您可以在对基础构造函数的调用中使用静态方法。

 class MyExceptionClass : Exception { public MyExceptionClass(string message, string extraInfo) : base(ModifyMessage(message, extraInfo)) { } private static string ModifyMessage(string message, string extraInfo) { Trace.WriteLine("message was " + message); return message.ToLowerInvariant() + Environment.NewLine + extraInfo; } } 

如果您需要调用基础构造函数,但不是马上就要完成,因为您的新(派生)类需要执行一些数据操作,所以最好的解决方案是使用工厂方法。 你需要做的是标记私人你的派生构造函数,然后在你的类中做一个静态方法将做所有必要的东西,然后调用构造函数并返回对象。

 public class MyClass : BaseClass { private MyClass(string someString) : base(someString) { //your code goes in here } public static MyClass FactoryMethod(string someString) { //whatever you want to do with your string before passing it in return new MyClass(someString); } } 
 public class MyExceptionClass : Exception { public MyExceptionClass(string message, Exception innerException): base(message, innerException) { //other stuff here } } 

您可以将内部异常传递给其中一个构造函数。

这是真的使用基地(东西)来调用基类的构造函数,但在重载的情况下使用这个关键字

 public ClassName() : this(par1,par2) { // do not call the constructor it is called in the this. // the base key- word is used to call a inherited constructor } // Hint used overload as often as needed do not write the same code 2 or more times 

从框架设计指南和FxCop规则。

1.自定义异常应该有一个以异常结束的名称

  class MyException : Exception 

2.例外应该是公开的

  public class MyException : Exception 

3. CA1032:异常应该执行标准的构造函数。

  • 一个公共无参数的构造函数。
  • 带有一个字符串参数的公共构造函数。
  • 具有一个字符串和异常的公共构造函数(因为它可以包装另一个异常)。
  • 一个序列化构造函数在类型不封闭的情况下受到保护,如果类型是封闭的,则是私有的。 基于MSDN :

     [Serializable()] public class MyException : Exception { public MyException() { // Add any type-specific logic, and supply the default message. } public MyException(string message): base(message) { // Add any type-specific logic. } public MyException(string message, Exception innerException): base (message, innerException) { // Add any type-specific logic for inner exceptions. } protected MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // Implement type-specific serialization constructor logic. } } 

要么

  [Serializable()] public sealed class MyException : Exception { public MyException() { // Add any type-specific logic, and supply the default message. } public MyException(string message): base(message) { // Add any type-specific logic. } public MyException(string message, Exception innerException): base (message, innerException) { // Add any type-specific logic for inner exceptions. } private MyException(SerializationInfo info, StreamingContext context) : base(info, context) { // Implement type-specific serialization constructor logic. } } 

你也可以做一个有条件的检查,并在构造函数中传递属性,这样可以有一定的灵活性。

 public MyClass(object myObject=null): base(myObject ?? new myOtherObject()) { } 

要么

 public MyClass(object myObject=null): base(myObject==null ? new myOtherObject(): myObject) { } 
 class Exception { public Exception(string message) { [...] } } class MyExceptionClass : Exception { public MyExceptionClass(string message, string extraInfo) : base(message) { [...] } } 
 public class MyException : Exception { public MyException() { } public MyException(string msg) : base(msg) { } public MyException(string msg, Exception inner) : base(msg, inner) { } } 

根据这里列出的其他答案,您可以将参数传递给基类构造函数。 建议在继承类的构造函数的开始处调用基类构造函数。

 public class MyException : Exception { public MyException(string message, string extraInfo) : base(message) { this.Message = $"{message} Extra info: {extraInfo}"; // You can omit the 'this.' portion above... } } 

我注意到,在你的例子中,你从来没有使用extraInfo参数,所以我认为你可能想连接extraInfo字符串参数到你的异常的Message属性(似乎这是被忽略的接受的答案和代码你的问题)。

这只需调用基类构造函数,然后使用额外的信息更新Message属性即可实现。

或者,由于Message属性是从基类继承的,所以您甚至不必显式地调用基类构造函数。 您可以直接从继承类的构造函数更新Message属性,如下所示:

 public class MyException : Exception { public MyException(string message, string extraInfo) { this.Message = $"{message} Extra info: {extraInfo}"; // You can omit the 'this.' portion above... } }