在控制台应用程序中处理行为,自定义功能等的基类?

时间:2014-01-29 01:53:33

标签: c# console-application static-methods

我有一个像这样的控制台应用程序:

public enum TypeMessage : int
{
    Log,
    Success,
    Warning,
    Alert
}

class Program
{
    static void Main(string[] args)
    {
        //do stuff
        WriteMessage("Sucess .... etc", TypeMessage.Success);
    }

    static void WriteMessage(string message, TypeMessage typeMessage = TypeMessage.Log)
    {
        switch (typeMessage)
        {
            case TypeMessage.Success:
                Console.ForegroundColor = ConsoleColor.Green;
                break;
            case TypeMessage.Warning:
                Console.ForegroundColor = ConsoleColor.Yellow;
                break;
            case TypeMessage.Alert:
                Console.ForegroundColor = ConsoleColor.Red;
                break;
            default:
                Console.ResetColor();
                break;
        }
        Console.WriteLine(message);
        Console.ResetColor();
    }

    static void ExecuteAction(Action action)
    {
        try
        {
            action.Invoke();
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    /*....*/
}

我想创建一个BaseProgram类class Program : BaseProgram并放置初始化设置,帮助方法等:

  • Console.Title = Title;
  • static void WriteMessage(string message,TypeMessage typeMessage = TypeMessage.Log)
  • static void ExecuteAction(Action action)

我尝试使用BaseProgram类中的静态构造函数并设置控制台标题但不起作用。

static BaseProgram()
{
    Console.Title = "Some Title";
}

如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用静态构造函数的当前实现将不起作用,除非您在应用程序入口点(BaseProgram)中调用/实例化Program.Main()或其衍生物。

class Program : BaseProgram
{
  static void Main(string[] args)
  {
     new BaseProgram(); // or, new Program();

     //do stuff
     WriteMessage("Sucess .... etc", TypeMessage.Success);
  }
}

话虽如此,代替在BaseProgram上使用静态构造函数,也许您可​​以考虑像这样实现它:

public abstract class BaseProgram
{      
  protected BaseProgram()
  {
    Console.Title = "Some Title";
    // other common initialization
  }

  public abstract void Run(string[] args);

  public void WriteMessage(string message, TypeMessage typeMessage = TypeMessage.Log)
  {
    ...
  }

  // other methods
}

public class Program : BaseProgram
{
  public static void Main(string[] args)
  {
    var program = new Program();
    program.Run(args);        
  } 

  public override void Run(string[] args)
  {
    //do stuff
    WriteMessage("Sucess .... etc", TypeMessage.Success);
  }
}

答案 1 :(得分:0)

标题是字符串字段吗?将它变成属性可能是一个更好的主意,这样每次设置它都会立即更新。

另外我认为默认的Program类是C#不是静态类,所以我真的不明白为什么要为BaseProgram类创建一个静态构造函数。 Main可以访问您创建的Program的任何静态组件(假设给出了适当的访问修饰符)。

祝你好运,我希望我能够帮助你!