gpt4 book ai didi

C# 创建静态类的全局实例

转载 作者:太空宇宙 更新时间:2023-11-03 19:52:30 25 4
gpt4 key购买 nike

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

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

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

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

静态类访问的简短示例

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

}
}

最佳答案

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

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

关于C# 创建静态类的全局实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37171660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com