簡體   English   中英

將string []關聯到IEnumerable <T> 和字符串在C#重載方法中的T

[英]Associate string[] to IEnumerable<T> and string to T in C# overloaded method

我創建了2個靜態重載方法,用於使用System.IO.StreamWriter寫入文件。 第一種方法應該寫一行。 第二種方法應該寫很多行。 我試圖使其通用,因此它不僅可以用於字符串(例如,其他原始類型,例如intfloatbool或任何具有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作為參數傳遞時,將調用TWriteLine方法?

在這一點上,我不確定是否可能。 如果不是,那么我想我只需要將方法重命名為WriteLine(T t)WriteLines(IEnumerable<T> ts)

您不會在方法的任何地方使用T類型。 您正在調用t.ToString() ,但是ToString()是在object上定義的,因此您不需要為此知道T

因此,您可以做的是創建非通用方法,並采用objectIEnumerable 在這一點上,如果不想打印單個字符,則還需要第三個重載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的忠實擁護者,我建議您使用重命名( WriteLineWriteLines )來突出兩種方法之間的功能差異,但是對於其他方法,這種相同的方法可能值得方法,因此仍應作為答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM