[英]Associate string[] to IEnumerable<T> and string to T in C# overloaded method
我創建了2個靜態重載方法,用於使用System.IO.StreamWriter
寫入文件。 第一種方法應該寫一行。 第二種方法應該寫很多行。 我試圖使其通用,因此它不僅可以用於字符串(例如,其他原始類型,例如int
, float
, bool
或任何具有ToString()
對象)。
public static void WriteLine<T>(string path, T t, bool append = false)
{
using (var file = new StreamWriter(path, append))
{
file.WriteLine(t.ToString());
}
}
public static void WriteLine<T>(string path, IEnumerable<T> ts, bool append = false)
{
using (var file = new StreamWriter(path, append))
{
foreach (var t in ts)
{
file.WriteLine(t.ToString());
}
}
}
但是,我的方法似乎有問題。 例如,假設我有以下代碼:
string pathString = @"C:\temp";
const string fileName = @"test.txt";
string path = Path.Combine(pathString, fileName);
const bool append = true;
string line = "single";
WriteLine(path, line, append);
string[] lines = { "first", "second", "third" };
WriteLine(path, lines, append);
對WriteLine
兩個調用都解析為我的2個方法中的第一個。 我希望第一次調用WriteLine
將解析為第一種方法,因為我傳遞了一個字符串,而第二次調用WriteLine
將解析為第二種方法,因為我傳遞了一個字符串數組。 然而,這種情況並非如此。
另外,如果我刪除第一個方法,則public static void WriteLine<T>(string path, T t, bool append = false)
然后兩次調用WriteLine
都將解析為public static void WriteLine<T>(string path, IEnumerable<T> ts, bool append = false)
,我得到以下輸出:
s
i
n
g
l
e
first
second
third
此外,如果我刪除第二種方法,則public static void WriteLine<T>(string path, IEnumerable<T> ts, bool append = false)
然后兩次調用WriteLine
都將解析為public static void WriteLine<T>(string path, T t, bool append = false)
,我得到以下輸出:
single
System.String[]
我該如何糾正我的靜態重載WriteLine
方法,以便將string[]
作為參數傳遞時,使用IEnumerable<T>
調用WriteLine
方法,而將string
作為參數傳遞時,將調用T
的WriteLine
方法?
在這一點上,我不確定是否可能。 如果不是,那么我想我只需要將方法重命名為WriteLine(T t)
和WriteLines(IEnumerable<T> ts)
您不會在方法的任何地方使用T
類型。 您正在調用t.ToString()
,但是ToString()
是在object
上定義的,因此您不需要為此知道T
因此,您可以做的是創建非通用方法,並采用object
和IEnumerable
。 在這一點上,如果不想打印單個字符,則還需要第三個重載string
,但是可以在最后一個方面實現第一個。
public static void WriteLine(string path, object o, bool append = false)
{
WriteLine(path, o.ToString(), append);
}
public static void WriteLine(string path, string s, bool append = false)
{
using (var file = new StreamWriter(path, append))
{
file.WriteLine(s);
}
}
public static void WriteLine(string path, IEnumerable e, bool append = false)
{
using (var file = new StreamWriter(path, append))
{
foreach (var o in e)
{
file.WriteLine(o.ToString());
}
}
}
現在,正如評論中所提到的,我不是該API的忠實擁護者,我建議您使用重命名( WriteLine
與WriteLines
)來突出兩種方法之間的功能差異,但是對於其他方法,這種相同的方法可能值得方法,因此仍應作為答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.