3

У меня есть приложение, которое реализует свою собственную консоль C# (через скриптовый механизм Roslyn). Я уже получил код для выполнения инструкции и получил возможное возвращаемое значение, и теперь я хочу вывести на консоль «приятную» строку. Тривиальный подход к вызову «ToString()» обычно имеет очень человеческий нечитаемый результат.Программный вывод Immediate Window

Лучшим решением для меня было бы иметь тот же вид контроля, что и в «Немедленном окне» Visual Studio.

Так, например, если мое заявление вычисляет новую строку [] { «ASD»}, а затем просто заходящих ToString() даст мне

System.String[] 

, где я хотел бы иметь эквивалентный выход из Immediate Window - что-то вроде этого:

{string[1]} 
    [0]: "asd" 

Так кто-нибудь знает, как назвать тот же Convertion, который использует Immediate Window?

+2

ближе я к достижению этой цели использует «объект дампера», как описано [здесь] (http://stackoverflow.com/questions/360277/what-is-the-best-way-to-dump-whole-objects-to-a-log-in-c) или [здесь] (http://stackoverflow.com/questions/1347375/ c-sharp-object-dumper) – GolfWolf

+0

Спасибо, очень интересно. Я оставлю этот вопрос немного открытым в надежде найти доступ API к фактическому непосредственному преобразованию окна (потому что мои пользователи также будут использовать Visual Studio, так что это будет действительно лучший и «самый знакомый» вывод), но эти ссылки несомненно, содержат хорошие примеры «удобочитаемого человека». – Imi

ответ

1

Кажется, у вас есть массив строк, содержащих одну строку, и вы вызываете .ToString() против массива. Попробуйте заменить

.ToString() 

с

[0].ToString() 

и посмотреть, если это даст вам ожидаемый результат.

+0

Использование строкового массива было всего лишь быстрым примером, чтобы показать хороший вывод непосредственного окна по сравнению со стандартной реализацией ToString(). Код, который я имею в виду, должен работать с каждым видом объекта. – Imi

+0

Просьба привести пример: какой объект вы вызываете. ToString()? Это класс, который вы определили самостоятельно? В этом случае вы должны переопределить метод ToString() внутри этого класса и вернуть желаемый текст. – Daniel

+0

Я не могу привести пример, потому что это общая консоль, которая должна выглядеть красиво со всеми видами объектов (или, по крайней мере, «самой»). Любой конкретный пример (например, строка [] выше) отвлекает от проблемы * generic * отображение неизвестного объекта. Я также не могу реализовать какой-либо метод на целевом объекте, потому что я не контролирую класс (и класс, вероятно, даже не существует в то время, когда я пишу код консоли). Конечно, я могу написать свой собственный код отображения, используя рефлексию и тесты для стандартных типов, но мой вопрос касается встроенного метода, который я мог бы использовать повторно. – Imi

1

В дополнение к предыдущим комментариям и ответам вы можете использовать любой тип сериализатора, который выводит человекообразное значение. Я использовал для этого Json.NET:

string humanReadable = JsonConvert.SerializeObject(someObj, Formatting.Indented); 

NuGet пакет: http://nuget.org/packages/Newtonsoft.Json/

Смежные вопросы