2016-06-24 3 views
0

Я относительно новичок в C# и задаю вопрос о выходных потоках.Обработка потока: функция печати C#

В моей текущей программе у меня есть класс под названием «партии», который содержит некоторые данные (пакетный идентификатор, startTime, endTime, продолжительность и т. Д.). У меня есть список партий, и я хотел бы иметь возможность печатать каждую партию как на консоли, так и в файле.

Я попытался добиться этого, написав метод 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}"); 
    ... 
    ... 
} 

Однако, когда я пытаюсь передать консоль моей функции печати, я получаю сообщение об ошибке. Я недостаточно осведомлен о потоках или о том, как работает консоль, или о дереве наследования, позволяющем обеим и Консолям иметь возможность использовать функцию WriteLine, но не мою функцию печати. Возможно, мне просто нужен другой тип в качестве параметра в моей функции, но я не знаю, что это за тип.

Мне удобнее программировать на C++, и я знаю, что если бы я работал с этим языком, было бы очень полезно перегрузить оператор ostream; в основном, я хочу, чтобы функция печати, которая будет вести себя как оператор ostream, будет.

Если кому-то нужно, чтобы я ответил на любые уточняющие вопросы, сообщите мне об этом, и я сразу смогу это сделать. Заранее спасибо!

+0

Что вы хотите сказать? – cvraman

+0

Вы можете это сделать, но я не уверен, что это метод, который большинство людей будет использовать по умолчанию ... Мне было бы проще просто написать две отдельные функции или даже одну функцию, которая имеет какой-то переключатель в зависимости от того, где вы хотите, чтобы он написал. – pay

+0

Мой вопрос заключается в том, как изменить мою функцию печати, чтобы иметь возможность печатать на консоли и в файле. Мне показалось интуитивным для новичков, что, поскольку Console.WriteLine() и fout.WriteLine() работают, я мог бы сделать это таким образом, но я мог ошибаться – CynicalPassion63

ответ

0

То, что вы ищете, является interface, создайте ILogger, обеспечивайте реализацию и передайте ее вашему методу печати. Таким образом, если вы хотите управлять логикой печати на основе условий, это было бы легко.

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