2016-06-24 33 views
0

我對C#比較陌生,並且對輸出流有個疑問。流處理:打印函數c#

在我目前的程序中,我有一個名爲「批次」的類,其中包含一些數據(批次ID,開始時間,結束時間,持續時間等)。我有一個批次列表,並希望能夠將每個批次打印到控制檯和文件。

我試圖通過在我的批處理類中寫入一個Print()方法來實現這一點,該方法可以整齊地打印所有內容。我想將這個函數作爲參數傳遞給控制檯或者輸出文件(我們稱之爲fout),以便函數可以寫入任何一個。由於這兩個控制檯和FOUT這樣使用的WriteLine()方法:

Console.WriteLine("Some text"); 
fout.WriteLine("Some text"); 

這似乎是我應該給我的打印功能類型的StreamWriter的參數,這樣我可以傳遞給它的控制檯或FOUT,並實現與上面相同的目標是這樣的:

Print(Console); 
Print(fout); 

void Print(StreamWriter stream) { 
    stream.WriteLine($"Batch ID: {Id}"); 
    ... 
    ... 
} 

但是,當我嘗試將控制檯傳遞給我的打印功能時,出現錯誤。我對流的熟悉程度不夠,或者控制檯如何工作,或者繼承樹會使fout和Console都能夠使用WriteLine函數,但不能使用我的打印函數。也許我只是需要一個不同的類型作爲我函數中的一個參數,但我不知道這個類型是什麼。我很自在地使用C++編程,而且我知道如果我使用這種語言,那麼重載ostream操作符是最有意義的;基本上,我想要一個可以像ostream運算符那樣工作的打印函數。

如果有人需要我回答任何澄清問題,請讓我知道,我可以立即做到這一點。提前致謝!

+0

你的問題是? – cvraman

+0

你可以做到這一點,但我不知道這是大多數人會默認使用的方法......我會發現它更簡單,只需編寫兩個單獨的函數,或者甚至一個具有某種開關的函數,這取決於哪裏你想要它寫。 – pay

+0

我的問題是如何修改我的打印功能以便能夠打印到控制檯和文件。對我來說,作爲一個新手,我覺得這很直觀,因爲Console.WriteLine()和fout.WriteLine()都可以這樣做,我可以這樣做,但我可能是錯誤的 – CynicalPassion63

回答

0

你在找什麼是interface,創建一個​​,提供實現並將它傳遞給你的打印方法。這樣,如果您想根據條件來控制打印邏輯,那很容易。

static void Main(string[] args) 
{ 
    Batch batch = new Batch() { ID = 1, StartTime = DateTime.Now, EndTime = DateTime.Now, Duration = 10 }; 

    batch.Print(new ConsoleLogger(), new FileLogger()); 
} 

public class Batch 
{ 
    public int ID { set; get; } 
    public DateTime StartTime { set; get; } 
    public DateTime EndTime { set; get; } 
    public double Duration { set; get; } 

    public void Print(ILogger logger) 
    { 
     logger.Log(this.ToString()); 
    } 

    public void Print(params ILogger[] loggers) 
    { 
     foreach (ILogger logger in loggers) 
     { 
      Print(logger); 
     } 
    } 

    public override string ToString() 
    { 
     return $"ID = {ID} ** StartTime = {StartTime} ** EndTime = {EndTime} ** Duration = {Duration}"; 
    } 
} 

public interface ILogger 
{ 
    void Log(string text); 
} 

public class ConsoleLogger : ILogger 
{ 
    public void Log(string text) 
    { 
     Console.WriteLine(text); 
    } 
} 

public class FileLogger : ILogger 
{ 
    string filePath = "log.txt"; 

    public void Log(string text) 
    { 
     File.AppendAllText(filePath, text + Environment.NewLine); 
    } 
}