Tauche ein in die Welt moderner Konsolen-Apps mit .NET und der mächtigen Bibliothek Spectre.Console! In diesem Blog-Beitrag zeige ich dir, wie du mit meiner ConsoleHelper
-Klasse wunderschöne, funktionale und benutzerfreundliche CLI-Anwendungen erstellst. Entdecke, wie du Header mit ASCII-Art präsentierst, robuste Eingabeaufforderungen mit Validierung umsetzt, JSON-Ausgaben stilvoll formatierst und klare Konsolenmeldungen renderst – und das alles mit einheitlichem Stil und minimalem Aufwand.
Mit ShowHeader
erzeugst du zu Beginn deiner Konsolen-Applikation eine klare, ansprechende Darstellung mit ASCII-Art und einem Panel mit Link-Info. Das AnsiConsole.Clear()
löscht vorher den Bildschirm, danach baust du ein Grid
auf mit einem großen Figlet
-Text und einem Panel
, das deinen Namen und eine Verlinkung zu tsjdev-apps.de enthält – ideal, um sofort einen starken visuellen Eindruck zu hinterlassen.
public static void ShowHeader()
{
AnsiConsole.Clear();
Grid grid = new();
grid.AddColumn();
grid.AddRow(
new FigletText("Spectre.Console")
.Centered()
.Color(Color.Red));
grid.AddRow(
Align.Center(
new Panel(
"[red]Sample by Thomas Sebastian Jensen " +
"([link]https://www.tsjdev-apps.de[/])[/]")));
AnsiConsole.Write(grid);
AnsiConsole.WriteLine();
}
C#Diese Überladung von GetString
zeigt einen simplen Prompt ohne Standardwert an und verlangt zwingend Eingabe – ein leeres oder nur aus Leerzeichen bestehendes Eingabefeld wird mit einer Validierungsfehlermeldung abgelehnt. Mit PromptString
wird der Prompt gebaut und das Ergebnis zurückgegeben.
public static string GetString(
string prompt,
bool showHeader = false)
=> PromptString(
prompt,
null,
input => string.IsNullOrWhiteSpace(input)
? ValidationResult.Error("[red]Please enter a value.[/]")
: ValidationResult.Success(),
showHeader);
C#Diese Variante erlaubt eine optional vorgegebene Rückfall‑Antwort (defaultValue
). Die Validierung bleibt identisch: ein leeres Ergebnis ist nicht erlaubt. Ansonsten verhält sich die Methode wie die vorherige Version und nutzt PromptString
, um die Eingabe abzufragen.
public static string GetString(
string prompt,
string defaultValue,
bool showHeader = false)
=> PromptString(
prompt,
defaultValue,
input
=> string.IsNullOrWhiteSpace(input)
? ValidationResult.Error("[red]Please enter a value.[/]")
: ValidationResult.Success(),
showHeader);
C#Hier wird speziell ein URL-Eingabeprompt erzeugt. Neben der Non-Empty-Prüfung erfolgt zusätzlich eine Validierung, ob die Eingabe eine gültige HTTP- oder HTTPS-URL ist. Damit stellst du sicher, dass nur sinnvolle Webadressen akzeptiert werden.
public static string GetUrl(
string prompt,
bool showHeader = false)
=> PromptString(
prompt,
null,
input =>
{
if (string.IsNullOrWhiteSpace(input))
{
return ValidationResult.Error("[red]Please enter a value.[/]");
}
if (!Uri.TryCreate(input, UriKind.Absolute, out var uriResult) ||
(uriResult.Scheme != Uri.UriSchemeHttp
&& uriResult.Scheme != Uri.UriSchemeHttps))
{
return ValidationResult.Error(
"[red]Please enter a valid URL starting with http or https.[/]");
}
return ValidationResult.Success();
},
showHeader);
C#Mit WriteJson
präsentierst du beliebige Objekte formatiert als JSON in der Konsole – in einem optisch eingerahmten Panel. JSON wird mit JsonSerializerOptions.WriteIndented = true
formatiert. Ein abgerundeter Rahmen, gelbe Borderfarbe und Panels-Header sorgen für Übersichtlichkeit und Lesbarkeit.
public static void WriteJson(
object obj,
string header)
{
AnsiConsole.Write(
new Panel(
new JsonText(
JsonSerializer.Serialize(obj, jsonSerializerOptions)))
.Header(header)
.Collapse()
.RoundedBorder()
.BorderColor(Color.Yellow));
}
C#Schlicht und effektiv – WriteToConsoleLine
schreibt einen weißen Text in einer neuen Zeile. Ideal für normale Informational Messages in der Benutzerführung.
public static void WriteToConsoleLine(
string text)
{
AnsiConsole.MarkupLine($"[white]{text}[/]");
}
C#Für Fehlermeldungen geeignet – WriteErrorToConsoleLine
gibt den Text in Rot aus und fügt eine neue Zeile ein. So fällt der Nutzer-Input sofort ins Auge.
public static void WriteErrorToConsoleLine(
string text)
{
AnsiConsole.MarkupLine($"[red]{text}[/]");
}
C#WriteToConsole ist die inline-Version von WriteToConsoleLine
. Sie gibt weißen Text direkt aus – ohne Zeilenumbruch. Praktisch für fortlaufende Ausgaben, z. B. für Eingabeaufforderungen oder Statusmeldungen.
public static void WriteToConsole(
string text)
{
AnsiConsole.Markup($"[white]{text}[/]");
}
C#Analog zu WriteToConsole
, aber in Rot ohne Zeilenumbruch. Damit kannst du Fehlermeldungen inline darstellen, ohne die Formatierung der Konsole zu stören.
public static void WriteErrorToConsole(
string text)
{
AnsiConsole.Markup($"[red]{text}[/]");
}
C#Der zentrale Helfer – PromptString
kapselt alle Eingabe-Logiken: Header anzeigen, Prompt konfigurieren, Default-Wert setzen, Validierung durchführen und schließlich die Eingabe zurückgeben. So stellst du sicher, dass alle Nutzungsvarianten von GetString
& GetUrl
konsistent arbeiten und du zentral nur eine Methode pflegen musst.
private static string PromptString(
string prompt,
string? defaultValue = null,
Func<string, ValidationResult>? validator = null,
bool showHeader = false)
{
if (showHeader)
{
ShowHeader();
}
TextPrompt<string> textPrompt =
new TextPrompt<string>(prompt)
.PromptStyle("white");
if (!string.IsNullOrEmpty(defaultValue))
{
textPrompt = textPrompt.DefaultValue(defaultValue);
}
if (validator != null)
{
textPrompt =
textPrompt
.ValidationErrorMessage("[red]Invalid input[/]")
.Validate(validator);
}
return AnsiConsole.Prompt(textPrompt);
}
C#Mit dieser ConsoleHelper
-Klasse machst du Konsolen-UI mit Spectre.Console übersichtlich, ansprechend und wartbar. Durch zentrale Methoden für Eingabe, Ausgabe und Visualisierung bleibt dein Code klar strukturiert – und lässt sich jederzeit erweitern. Perfekt geeignet für schöne Konsolenanwendungen mit .NET.
Beispiel: Wetterdaten mit ConsoleHelper
und OpenWeather API abrufen
Im folgenden Code siehst du, wie du deine ConsoleHelper
-Klasse praktisch in Aktion nutzt: Der Nutzer wird zur Eingabe des API-Schlüssels und der Stadt aufgefordert (beide Prompts können optional den Header anzeigen), anschließend wird per HttpClient
das Wetter abgefragt. Je nach Ergebnis werden die Daten stilvoll als JSON dargestellt oder eine Fehlermeldung ausgegeben. Ein konsistentes CLI-Erlebnis – mit wenig Aufwand!
using SpectreConsoleSample.Utils;
using System.Text.Json;
// Get the OpenWeather API key
string apiKey =
ConsoleHelper.GetString(
"Please enter your OpenWeather API key:",
showHeader: true);
// Get the city name
var city =
ConsoleHelper.GetString(
"Please enter the city name:",
"Pforzheim",
showHeader: true);
// Make the API request
using HttpClient httpClient = new();
string url = $"https://api.openweathermap.org/data/2.5/weather" +
$"?q={city}&appid={apiKey}&units=metric";
try
{
HttpResponseMessage response = await httpClient.GetAsync(url);
if (response.IsSuccessStatusCode)
{
// Read the response content
var content =
await response.Content.ReadAsStringAsync();
// Parse the JSON response
JsonElement weatherData =
JsonSerializer.Deserialize<JsonElement>(content);
// Display the weather data in the console
ConsoleHelper.ShowHeader();
ConsoleHelper.WriteJson(weatherData, $"Weather in {city}");
// Display additional information
ConsoleHelper.WriteToConsoleLine("\nPress any key to exit...");
Console.ReadKey(true);
}
else
{
// If the request failed, read the error content
string errorContent =
await response.Content.ReadAsStringAsync();
// Display an error message if the request failed
ConsoleHelper.WriteErrorToConsoleLine(
$"Error fetching weather data: {errorContent}");
}
}
catch (Exception ex)
{
// Handle exceptions and display an error message
ConsoleHelper.WriteErrorToConsoleLine(
$"Exception occurred: {ex.Message}");
}
C#Eingaben mit Stil: Zwei Prompts – für den API-Key und den Stadtnamen – nutzen optional das Header-Layout, um ein konsistentes Erlebnis zu bieten.
HTTP-Request: HttpClient
ruft die aktuelle Wetter-API auf, abhängig von city
und apiKey
.
Erfolgsausgabe: Bei Erfolg wird das JSON-Ergebnis als gut lesbares, eingerahmtes Panel ausgegeben – dank WriteJson
.
Fehlerbehandlung: Ob HTTP-Fehler oder Exception – allen Fehlerfällen ist ein roter, auffälliger Text gewidmet via WriteErrorToConsoleLine
.
Benutzerfreundlich: Ein abschließender Hinweis und eine Wartefunktion per Console.ReadKey()
runden das Erlebnis ab.

Dieses vollständige Beispiel zeigt eindrucksvoll, wie du mit deiner ConsoleHelper
-Klasse eine stilvolle, interaktive CLI-Anwendung realisierst – von Eingabe bis Fehlerbehandlung. Perfekt, um direkt in Projekten eingesetzt zu werden!
📦 Hol dir den kompletten Code, inklusive ConsoleHelper
-Klasse und Beispielprojekt, direkt auf GitHub: https://github.com/tsjdev-apps/spectre-console-demo