У меня есть экземпляр System.IO.TextWriter. Его можно передать из System.Console. Есть ли способ узнать, что это консоль, не вызывая исключения? Я пробовал это, но не скомпилировал:

   if (_myWriter as System.Console != null ) // error compiling

Полагаю, мне нужно использовать проверку типа вместо бокса?

c#
0
David.Chu.ca 22 Июл 2009 в 20:02

4 ответа

Лучший ответ

Вы можете попробовать что-то вроде IsConsoleOut ниже:

static void Main(string[] args)
{
     Console.WriteLine("Console.Out: {0}", IsConsoleOut(Console.Out));
     Console.WriteLine("Other: {0}", IsConsoleOut(new StreamWriter(Stream.Null)));
     Console.ReadLine();
}

private static bool IsConsoleOut(TextWriter textWriter)
{
     return object.ReferenceEquals(textWriter, Console.Out);
}

К сожалению, это не доказательство дурака, поскольку кто-то может создать свой собственный TextReader непосредственно вокруг выходного потока консоли (используя Console.OpenStandardOutput () для получения потока), и вышеуказанная функция не сможет его идентифицировать, но при условии, что TextWriter имеет всегда заходить из Консоли. А ведь должно работать - думаю!

2
Rob Levine 22 Июл 2009 в 16:08

Я предлагаю вам пересмотреть свои варианты использования. Например, System.Console.Out можно перенаправить в файл. Будет ли ваш код по-прежнему рассматривать его как консоль?

0
John Saunders 22 Июл 2009 в 19:31
if(_myWriter == System.Console.Out)
0
Hasani Blackwell 22 Июл 2009 в 16:07

Вы могли сделать:

if (_myWriter == Console.Out)

Но это не гарантия - например, это может быть оболочка вокруг Console.Out.

Почему в таком случае нужно относиться к нему по-другому? Было бы лучше спроектировать вокруг этого, чем для разработчиков специальных консолей, ИМО.

0
Jon Skeet 22 Июл 2009 в 16:06