Periodensystem der Elemente 👍 👎

Aus einem älteren Projekt habe ich einen Teil extrahiert und als Periodensystem der Elemente bereitgestellt.

Ich werde schrittweise noch einige weitere Informationen und auch Funktionalität ergänzen, kann dazu jedoch noch keinen konkreten Zeitplan nennen, da ich derzeit zeitlich leider recht eingespannt bin.

Parameter einer C#-Methode per Reflexion ermitteln 👍 👎

In einem früheren Beitrag hatte ich beschrieben, wie sich die Parameter einer Methode in Java programmatisch ermitteln lassen. Zur Reflexion in C# möchte ich gerne einen etwas ausführlicheren Beitrag schreiben; auf Grund mehrfacher Nachfrage möchte ich zwischenzeitlich jedoch zumindest eine ähnliche Funktionalität für C# vorstellen:
Parameter einer C#-Methode per Reflexion ermitteln
0102030405060708
public static IEnumerable<Dictionary<string, string>> GetMethodParameterList(    string typeName,    string methodName) {    return Type.GetType(typeName).GetMethods()        .Where(m => m.Name == methodName)        .Select(m => m.GetParameters().ToDictionary(k => k.Name, v => v.ParameterType.Name));}
Die Verwendung gestaltet sich sehr einfach; wir ermitteln dazu z. B. alle Parameter für Console.WriteLine:
Methode verwenden und Ergebnis auf der Standardausgabe ausgeben
010203040506070809101112
IEnumerable<Dictionary<string, string>> methodParameterList = GetMethodParameterList(    "System.Console",    "WriteLine");
foreach(Dictionary<string, string> method in methodParameterList) { foreach(KeyValuePair<string, string> parameter in method) { Console.WriteLine($"{parameter.Value} {parameter.Key}"); }
Console.WriteLine();}
Falls sich jemand über die verschachtelte Struktur wundert sei darauf hingewiesen, dass es auf Grund der Technik des Überladens mehrere Methoden gleicher Bezeichnung und daher auch mehrere Parameter-Listen geben kann.

Sprachausgabe mit C# 👍 👎

In diesem Beitrag möchte ich kompakt aufzeigen, wie sich mit C# programmatisch eine Sprachausgabe umsetzen lässt. Die programmatische Erkennung von Spracheingabe werde ich in einem separaten Beitrag behandeln.

Die technische Basis dieses Beitrages ist die SpeechSynthesizer-Klasse. Zuerst kann man sich einen Überblick der installierten Stimmen verschaffen und ggf. geeignete(re) auswählen:
Sprachen auflisten und auswählen
010203040506070809101112
using(SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer()) {    // Stimmen auflisten    foreach(InstalledVoice installedVoide in speechSynthesizer.GetInstalledVoices()) {        Console.WriteLine($"{installedVoide.VoiceInfo.Name}: {installedVoide.VoiceInfo.Description}");    }
// Stimme per Bezeichnung auswählen speechSynthesizer.SelectVoice("…");
// Stimme über Eigenschaften auswählen speechSynthesizer.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult);}
Die eigentliche Sprachausgabe gestaltet sich sehr einfach:
Sprache ausgeben (oder speichern)
01020304050607
using(SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer()) {    // Ausgabe in WAV-Datei    speechSynthesizer.SetOutputToWaveFile("helloWorld.wav");
// Text sprechen (bzw. speichern, sofern Ausgabe in Datei gewählt) speechSynthesizer.Speak("Ich begrüße alle Leser zu diesem neuen Beitrag.");}
Darüber hinaus besteht mit der SpeakSsml(…)-Methode auch die Möglichkeit der Ausgabe SSML-formatierten Textes, worüber beispielsweise die besondere Betonung einzelner Wörter ermöglicht wird.

C#-Methodenaufruf mit Timeout 👍 👎

Hin und wieder kann es sinnvoll sein, die Ausführung einer Methode zeitlich einzuschränken. Dies trifft besonders häufig dann zu, wenn auf Daten per Netzwerk gewartet werden soll. Eine Implementierung wäre wie folgt denkbar:
Hilfsmethode implementieren
01020304050607080910111213141516
public static class TaskHelper {    public static bool ExecuteWithTimeout(        Action<CancellationToken> action,        TimeSpan timeout,        CancellationToken cancellationToken = default(CancellationToken)    ) {        try {            return Task.Run(() => action(cancellationToken)).Wait(                (int) timeout.TotalMilliseconds,                cancellationToken            );        } catch(OperationCanceledException) {            return false;        }    }}
Die Verwendung gestaltet sich nun sehr einfach für (nahezu) beliebige Aufrufe:
Hilfsmethode verwenden
0102030405060708091011
if(TaskHelper.ExecuteWithTimeout(    cT => Thread.Sleep(TimeSpan.FromSeconds(3)),  // Aufgabe simulieren    TimeSpan.FromSeconds(2)                       // Timeout setzen)) {    /* Ausführung erfolgreich */} else {    /**     * Die Ausführung wurde abgebrochen oder konnte     * nicht in der gegebenen Zeitspanne erfolgen.     */}
In der Praxis bietet sich beispielsweise noch die Unterstützung von Rückgabewerten an. Darüber hinaus sollte die Dokumentation zur CancellationToken-Struktur und allgemein zum Aufgabenabbruch konsultiert werden.

Arbeitgeber- und Wohnortwechsel 👍 👎

Nach nun etwa 10 Jahren professioneller Tätigkeit für meinen bisherigen Arbeitgeber in Berlin nutze ich eine in vielerlei Hinsicht passende Gelegenheit für eine sowohl berufliche als auch private Veränderung.

Arbeitgeberwechsel

Ich arbeite ab dem 1. Februar 2018 als Softwareentwickler im öffentlichen Dienst für Dataport. Technologisch bewege ich mich dabei weiterhin hauptsächlich im Bereich der .NET-Technologie.

Wohnortwechsel

Ich werde im Zuge meiner neuen Herausforderungen auch einen örtlichen Wechsel vollziehen und meinen Lebensmittelpunkt daher mit Aufnahme meiner neuen Tätigkeit nach Hamburg verlegen.


Für euch als Leser ändert sich jedoch nichts, da ich weiterhin gerne Beiträge zum Thema C#/.NET schreiben werde.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche