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
Die Verwendung gestaltet sich sehr einfach; wir ermitteln dazu z. B. alle Parameter für 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));}
Console.WriteLine
:
Methode verwenden und Ergebnis auf der Standardausgabe ausgeben
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. 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();}
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
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
Die eigentliche Sprachausgabe gestaltet sich sehr einfach:
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);}
Sprache ausgeben (oder speichern)
Darüber hinaus besteht mit der 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.");}
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
Die Verwendung gestaltet sich nun sehr einfach für (nahezu) beliebige Aufrufe:
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; } }}
Hilfsmethode verwenden
In der Praxis bietet sich beispielsweise noch die Unterstützung von Rückgabewerten an. Darüber hinaus sollte die Dokumentation zur 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. */}
CancellationToken
-Struktur und allgemein zum Aufgabenabbruch konsultiert werden. Temporäre Datei mit C# erstellen und implizit löschen
Hin und wieder kann es – beispielsweise bei der Arbeit mit Datenströmen – sinnvoll bzw. notwendig sein, mit Dateien zu arbeiten, die nur vorübergehend benötigt werden. Das .NET-Framework unterstützt dies mit der Methode
Path.GetTempFileName()
, ohne jedoch die Datei implizit wieder zu entfernen.
Um diesen kleinen Makel zu beheben, bietet sich eine kompakte Implementierung wie die folgende Lösung an, welche auf using
basiert:
Klasse implementieren
Die Verwendung gestaltet sich nun sehr komfortabel, wobei die Datei innerhalb der entsprechenden Anweisung existiert und wie üblich verwendet werden kann; anschließend wird diese automatisch wieder gelöscht:
010203040506070809101112
public class TemporaryFile : IDisposable { public string Name { get; private set; }
public TemporaryFile() { this.Name = Path.GetTempFileName(); }
public void Dispose() => File.Delete(this.Name);}
Klasse verwenden
01020304050607080910111213
/* Datei existiert noch nicht */
using(TemporaryFile temporaryFile = new TemporaryFile()) { /* Datei existiert ab sofort */
File.WriteAllBytes(temporaryFile.Name, new byte[] { 0x01, 0x03, 0x03, 0x07 });
/* Datei existiert weiterhin */}
/* Datei existiert nicht mehr */
Quartal mit C# ermitteln
Leider bietet die
DateTime
-Struktur standardmäßig keine eingebaute Funktionalität zur Ermittlung des Quartals einer Instanz. Wir werden diese daher als praktische Erweiterungsmethode ergänzen:
Erweiterungsmethode implementieren
Durch die vorherige Addition von 0102030405
public static class DateTimeExtensions { public static int GetQuarter(this DateTime dateTime) { return ((dateTime.Month + 2) / 3); }}
2
wird die (ganzzahlige) Teilbarkeit bei richtigem Ergebnis sichergestellt. Indem die Teilung variabel gestaltet wird, beispielsweise mit Hilfe eines zu übergebenden Aufzählungswertes mit passenden ganzzahligen Werten, können auch andere Jahresteile (z. B. Halbjahre) sehr einfach ermittelt werden:
Erweiterungsmethode implementieren (erweitert)
Die Verwendung gestaltet sich in beiden Fällen naheliegend einfach:
010203040506070809101112
public static class DateTimeExtensions { public static int GetYearDivisionPart(this DateTime dateTime, YearDivision yearDivision) { int monthsPerDivision = (int) yearDivision;
return ((dateTime.Month + (monthsPerDivision – 1)) / monthsPerDivision); }
public enum YearDivision { Half = 6, Quarter = (Half / 2) }}
Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)
Tags
.NET · ADO.NET · Work · ASP.NET MVC · Blog · C# · Generics · Society · Computer Science · Java · LINQ · Logic · Mathematics · Network · PHP · Project · Security · Software development · Studies · Technics · Theory · Web design · WPF