Konsolen-Applikationen mit Spectre.Console und .NET
Lesedauer: 5 Minuten

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.

ConsoleHelper – ShowHeader
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.

ConsoleHelper – GetString
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.

ConsoleHelper – GetString
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.

ConsoleHelper – GetUrl
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.

ConsoleHelper – WriteJson
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.

ConsoleHelper – WriteToConsoleLine
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.

ConsoleHelper – WriteErrorToConsoleLine
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.

ConsoleHelper – WriteToConsole
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.

ConsoleHelper – WriteErrorToConsole
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.

ConsoleHelper – PromptString
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!

Program.cs
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

Blockierte Ports unter Windows freigeben Alexa Skills mit .NET entwickeln Liste öffentlicher APIs