2017-02-11 4 views
0

System.IO.StreamWriter을 사용하여 파일에 쓰기위한 2 가지 정적 오버로드 된 메서드를 만들었습니다. 첫 번째 방법은 한 줄을 작성해야합니다. 그리고 두 번째 방법은 여러 줄을 써야합니다. 나는 문자열을 일반 문자열 (즉, int, float, bool 또는 ToString() 인 객체)과 같은 다른 기본 유형에 사용할 수 있도록 일반화하려고했습니다.문자열 []을 IEnumerable <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()); 
     } 
    } 
} 

그러나 내 방법은 문제가있는 것처럼 보입니다. 제 2 방법의 첫 번째에 WriteLine 해결에

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에 대한 첫 번째 호출이 문자열을 전달할 것이므로 WriteLine에 대한 두 번째 호출은 문자열 배열을 전달하는 것이므로 두 번째 방법으로 해결 될 것이기 때문에 첫 번째 메소드가 첫 번째 메소드로 변환되기를 기대하고 있습니다. 그러나 이것은 사실이 아닙니다. 또한

, 나는 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[] 

가 어떻게 내 정적,385 과부하 해결할 수 있습니다 public static void WriteLine<T>(string path, T t, bool append = false)과 나는 다음과 같은 출력을 얻을메서드를 호출하여 string[]을 매개 변수로 전달하면 WriteLine 메서드가 IEnumerable<T>이고 전달되는 경우 string 매개 변수가 WriteLine 메서드를 T으로 호출합니까?

이 시점에서 가능한지 확실하지 않습니다. 그렇지 않다면 메서드의 이름을 WriteLine(T t)WriteLines(IEnumerable<T> ts)

+1

'string'은'IEnumerable '을 구현합니다. 이 특수한 경우에는'WriteLine (string s)'의 오버로드가 필요하거나 수동으로'WriteLine (line)'으로 호출을 한정 할 수 있습니다. – yaakov

+3

가장 읽기 쉬운 방법은 과부하가 전혀없는 방법입니다.'WriteLine (IEnumerable )'은 한 줄을 쓰지 않기 때문에 모든 행을 씁니다. 대신 WriteLines (IEnumerable )이라고해야합니다. – dasblinkenlight

+0

@codran -'WriteLine (string s)'의 오버로드를 원하지 않는 이유는 명시 적으로 문자열로 캐스팅하지 않고도'int' 또는'float'와 같은 다른 원시 데이터 유형을 전달할 수 있기 때문입니다. 예를 들어,'WriteLine (123)'또는'WriteLine (1.23)'입니다. – kimbaudi

답변

1

으로 변경해야합니다. 메소드의 어느 곳에서나 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)로 이동하는 것이 좋습니다,하지만 동일한 접근법이 다른 방법에 대해 가치가있을 수 있으므로 여전히 대답으로 제공되어야합니다.