我可以使用泛型以不同的方式输出不同的数据类型吗?



我有这个简单的代码:

static void WriteToLogFile(string LogFileName, string S, bool AppendCRLF = false)
// Todo: make a generic, output formatting dependent on data type?
{
if (AppendCRLF)
{
Console.WriteLine(S);
}
else
{
Console.Write(S);
}
}

调用例程负责将任何数据转换为字符串。

我现在想做的是能够传递任何数据类型,并使输出依赖于我传递的数据类型。 例如,如果我传递 DateTime,我希望它使用某个模板格式化,如果我传递一个字符串,我希望它括在双引号中,等等。

我知道我可以为每种数据类型重载 WriteToLogFile,但我想知道是否有使用泛型的解决方案?像这样:

static void WriteToLogFile<T>(string LogFileName, ref T X, bool AppendCRLF = false)
{
...
switch (TypeOf(X))
{
case "string": Console.Write('"' + X + '"'); break;
case "DateTime": Console.Write(X.ToString("yyyy-MM-dd hh:mm:ss"); break;
default: Console.Write(X.toString());
}
....
}

这样的构造在 C# 中可能吗?

您可以在模式匹配中使用类型与 switch 语句:

switch (X)
{
case string s: Console.Write('"' + s + '"'); break;
case DateTime dt: Console.Write(dt.ToString("yyyy-MM-dd hh:mm:ss"); break;
default: Console.Write(X.toString());
}

同样在您的情况下,您似乎可以利用这种模式匹配风格:

var toLog = X switch
{
string s => $"{s}",
DateTime dt => dt.ToString("yyyy-MM-dd hh:mm:ss"),
_ => X.ToString()
};
if (AppendCRLF)
{
Console.WriteLine(toLog);
}
else
{
Console.Write(toLog);
}

最新更新