2016-06-24 19 views
0

私は比較的新しいC#です。出力ストリームに関する質問があります。ストリーム処理:print関数c#

私の現在のプログラムでは、いくつかのデータ(バッチID、開始時間、終了時間、継続時間など)を含む「バッチ」という名前のクラスがあります。私はバッチのリストを持っており、各バッチをコンソールとファイルの両方に印刷できるようにしたいと考えています。

私はすべてをきちんと印刷するバッチクラスの中にPrint()メソッドを書くことでこれを達成しようとしました。私はこの関数に引数として、コンソールまたは出力ファイル(foutと呼ぶ)を渡して、関数がどちらかに書き込むことができるようにしたいと考えています。私はそれのいずれかのコンソールまたはFOUTに渡すことができるように私の印刷機能に型のStreamWriterのパラメータを与え、達成すべきであるようにそれが見えた

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

:コンソールとFOUTの両方が、このようなWriteLineメソッド()メソッドを使用しますので、上記の同じ目標:

Print(Console); 
Print(fout); 

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

ただし、コンソールを印刷機能に渡すとエラーが発生します。私はストリームやコンソールの仕組みや継承ツリーに慣れていないので、foutとConsoleの両方でWriteLine関数を使用できるようになりますが、印刷機能は使用できません。おそらく、私は関数内でパラメータとして別の型を必要としているだけですが、その型が何であるかはわかりません。

私はC++でのプログラミングが最も快適で、私がその言語で作業していた場合、ostream演算子に過負荷をかけるのが最も理にかなっています。基本的には、ostreamオペレータとして動作するプリント機能が必要です。

誰かが明確な質問に答えるために私を必要とする場合は、私に知らせてください。私はすぐにそれを行うことができます。前もって感謝します!

+0

お困りですか? – cvraman

+0

あなたはそれを行うことができますが、私はそれがほとんどの人がデフォルトを使う方法であるかどうかはわかりません...私は、2つの別々の関数を書くことがより簡単であるか、あなたはそれを書いてほしい。 – 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); 
    } 
} 
関連する問題