【问题标题】:C# Create Global instance of a Static ClassC# 创建静态类的全局实例
【发布时间】:2016-05-11 19:25:32
【问题描述】:

我继承了一个代码库,我希望做一个小的更改,而不需要对类中的一些静态函数进行大量重构,以便能够与配置信息一起使用。

我的问题是有一个静态类具有与控制台交互的功能。然后可以使用 Console.Write() 表示法简单地调用这些静态函数。我遇到的问题是我需要根据传递给主程序的命令行选项对静态类进行一些配置更改。

虽然我通常会使用依赖注入来支持这一点,但代码库没有将此类的实例传递给使用它的对象。我需要在运行时在静态类中配置一个设置来控制类中的函数如何工作。

我不知道如何使用 C#(和其他语言)执行此操作,而无需进行更大的更改以支持依赖注入。

静态类访问的简短示例

public class ConsoleUtilities
{
    public static string ApplicationVersion
    {
        get
        {
            Assembly MyProgram = Assembly.GetEntryAssembly();
            return MyProgram.GetName().Version.ToString();
        }
    }

    /// <summary>
    /// Show Text on the screen, and optionally write to LogPathFileName
    /// </summary>
    /// <param name="HelpText">Text to show</param>
    /// <param name="LogPathFileName">Path and File Name of LogFile to write to. Use "" to not Log</param>
    public static void ShowText(string[] HelpText, string LogPathFileName)
    {
        foreach (string HelpLine in HelpText)
        {
            ShowText(HelpLine, System.ConsoleColor.Gray, System.ConsoleColor.Black, LogPathFileName);
        }
    }

    public static void ShowText(string HelpLine, System.ConsoleColor Foreground, System.ConsoleColor Background, string LogPathFileName)
    {
        ShowTextOnConsole(HelpLine, Foreground, Background, true, LogPathFileName);
    }
}

使用静态类的示例程序

public class Program
{
    public enum EXIT_CODES { OK = 0, CONFIG_ERROR, FILE_ERROR, COMPARE_ERROR, EXECUTION_ERROR, WARNING };
    public const string LogPathFileName = "Tool.log";

    static int Main(string[] args)
    {
        int ApplicationExitCode = (int)EXIT_CODES.OK;
        int Failures = 0;

        string[] AboutText = { 
            "Tool.exe - " + CSharpUtilities.ConsoleUtilities.ApplicationVersion,
            "Copyright (c) 2014",
            ""
        };

        Settings AppSettings = new Settings(AboutText);

        // Ensure Command Line is valid before proceeding 
        ApplicationExitCode = (int)EXIT_CODES.CONFIG_ERROR;
        ApplicationCommandLine AppCommandLine = new ApplicationCommandLine();

        try
        {
            if (AppCommandLine.ParseCommandLine(args))
            {
                // Load Application Settings
                LoadApplicationSettings(ref AppSettings, AppCommandLine);
                ConsoleUtilities.ShowText(AboutText, LogPathFileName);
                List<string> ValidationErrors = ValidateApplicationSettings(AppSettings);
                if (ValidationErrors.Count == 0)
                {
                    ...
                }
                else
                {
                    ConsoleUtilities.ShowText(ValidationErrors.ToArray(), LogPathFileName);
                }
            }
        }

        catch (Exception e)
        {
            ApplicationExitCode = (int)EXIT_CODES.EXECUTION_ERROR;      // Exception occured in processing. Fail the program execution.
            string[] SystemError = { "System Error", e.Message.ToString() };
            ConsoleUtilities.ShowText(SystemError, LogPathFileName);
        }

    }
}

【问题讨论】:

  • 向类添加一些静态字段/属性?
  • @Chris 要清楚,该类永远不会在任何地方初始化。我仍然可以设置这些值吗?如果是这样,这会变得容易得多。
  • 当然。静态类在首次使用时自动初始化。

标签: c# static static-methods


【解决方案1】:

您可以将静态字段放在静态类中,并在解析命令行后在程序中对其进行初始化。例如:

public class ConsoleUtilities
{
   public static bool ShowLog { get; set; } = true; // true, if we want log messages to be printed

   public static void Log(string[] HelpText, string LogPathFileName)
   {
    if (ShowLog) {
    foreach (string HelpLine in HelpText)
    {
        ShowText(HelpLine, System.ConsoleColor.Gray, System.ConsoleColor.Black, LogPathFileName);
    }
   }
}

}

然后当你在代码中的某处解析命令行时,你会使用

ConsoleUtilities.ShowLog = true; // or false

【讨论】:

    【解决方案2】:

    您可以将配置公开为静态字段或属性:

    public class ConsoleUtilities
    {
        public static string ApplicationVersion
        {
            get
            {
                Assembly MyProgram = Assembly.GetEntryAssembly();
                return MyProgram.GetName().Version.ToString();
            }
        }
    
        public static ConsoleConfiguration Configuration = new ConsoleConfiguration();
    
        /// <summary>
        /// Show Text on the screen, and optionally write to LogPathFileName
        /// </summary>
        /// <param name="HelpText">Text to show</param>
        /// <param name="LogPathFileName">Path and File Name of LogFile to write to. Use "" to not Log</param>
        public static void ShowText(string[] HelpText, string LogPathFileName)
        {
            foreach (string HelpLine in HelpText)
            {
                ShowText(HelpLine, Configuration.BackgroundColor, Configuration.ForegroundColor, LogPathFileName);
            }
        }
    
        public static void ShowText(string HelpLine, System.ConsoleColor Foreground, System.ConsoleColor Background, string LogPathFileName)
        {
            ShowTextOnConsole(HelpLine, Foreground, Background, true, LogPathFileName);
        }
    }
    
    public class ConsoleConfiguration
    {
        public ConsoleColor ForegroundColor { get; set; }
        public ConsoleColor BackgroundColor { get; set; }
    
        public ConsoleConfiguration()
        {
            ForegroundColor = ConsoleColor.Gray;
            BackgroundColor = ConsoleColor.Black;
        }
    }
    

    你可以像这样重新配置:

    ConsoleUtilities.Configuration.ForegroundColor = ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      相关资源
      最近更新 更多