2017-02-11 6 views
0

System.IO.StreamWriterを使用してファイルに書き込むための2つの静的オーバーロードされたメソッドを作成しました。最初のメソッドは1行を書くべきです。そして、2番目の方法は、多くの行を書く必要があります。文字列だけでなく、intfloatboolToString()のオブジェクトなどの他のプリミティブ型でも使用できるように汎用的にしようとしました。ストリング[]をIEnumerable <T>に、ストリングをTにC#オーバーロードされたメソッド

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

私の2つの方法の最初にWriteLine解決するために、両方のコール:たとえば、私は次のコードがあるとします。 WriteLineへの最初の呼び出しは、文字列を渡しているのでWriteLineへの2番目の呼び出しは2番目のメソッドに解決されるので、1番目のメソッドに解決することを期待していました。しかし、そうではありません。また

、私は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)を削除し、私は次の出力を得る場合:私は、WriteLine解決するには、両方のコールを第二の方法public static void WriteLine<T>(string path, IEnumerable<T> ts, bool append = false)を削除する場合は、さらに

s 
i 
n 
g 
l 
e 
first 
second 
third 

single 
System.String[] 

がどのように私は私の静的を過負荷に修正することができます:public static void WriteLine<T>(string path, T t, bool append = false)に、私は次の出力を得ますパラメータとしてstring[]をパラメータとして渡してを呼び出し、stringをパラメータとして渡して、WriteLineメソッドをTと呼びます。

この時点で、可能かどうかはわかりません。そうでない場合は、メソッドの名前をWriteLine(T t)WriteLines(IEnumerable<T> ts)

+1

'string'は' IEnumerable 'を実装しています。この特別な場合、 'WriteLine(string s)'のオーバーロードが必要な場合や、 'WriteLine (line)'として手動でコールを修飾することができます。 – yaakov

+3

最も読みやすいアプローチは、過負荷をまったく持たないことです。これは、 'WriteLine (IEnumerable )'は1行を書きませんので、何行も書き込むので、代わりに 'WriteLines (IEnumerable )'と呼ぶべきです。 – dasblinkenlight

+0

@codran - 'WriteLine(string s)'のオーバーロードが欲しくない理由は、明示的に文字列としてキャストしなくても、 'int'や' float'のような他の基本データ型を渡すことができるからです。たとえば、 'WriteLine(123)'や 'WriteLine(1.23)'などです。 – kimbaudi

答えて

1

に変更する必要があります。方法のどこにでもタイプTを使用していません。あなたはt.ToString()を呼び出していますが、ToString()objectに定義されていますので、Tを知っている必要はありません。

したがって、objectIEnumerableという非ジェネリックメソッドを作成することができます。その時点で、個々の文字を印刷したくない場合は、第3のオーバーロードを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のファンではないと私はあなたが2つの方法の間の機能的な違いを強調するためにリネーム(WriteLineWriteLines)で行くお勧めしますが、この同じアプローチが他の方法にとって価値があるかもしれないので、まだ答えとして利用できるはずです。

関連する問題