Objekte mit C# dynamisch erzeugen 👍 👎

Insbesondere bei der Entwicklung von unterstützenden Tools kann es hilfreich sein, Objekte dynamisch erzeugen zu können, ohne vorher den konkreten Typ zu kennen. Ich habe so etwas beispielsweise einmal im Rahmen einer interaktiven API-Dokumentation genutzt. Das .NET-Framework bietet hierfür die Activator-Klasse.

Als Basis für das Beispiel soll folgende triviale Klasse dienen:
Beispielklasse
01020304050607080910111213141516
public class Person {    public string FirstName {        get; set;    }
public string LastName { get; set; }
public Person() {}
public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; }}
Hiervon können wir nun dynamisch ein Objekt erzeugen:
Objekt dynamisch erzeugen
01020304
Activator.CreateInstance(Type.GetType("Person"), new[] {    "Holger",    "Stehle"});
Dieses Vorgehen ist jedoch nur in Ausnahmefällen zu empfehlen, da ihr schließlich die Vorteile der statischen Typisierung größtenteils verliert. Es bietet sich daher je nach Anwendungsfall die Verwendung von Schnittstellen (z. B. bei Plugins) oder die Verwendung generischer Programmierung (z. B. zur internen Abstraktion) an.

Die in diesem Beitrag vorgestellte Klasse bietet auch eine Variante mit Typparameter an:
Objekt per Typparameter erzeugen
01
Person person = Activator.CreateInstance<Person>();
Diese Funktionalität ist in der Praxis zur "normalen" Entwicklung jedoch nur bedingt hilfreich, schließlich musste dazu der Typ bereits vorab bekannt sein und ihr hättet das Objekt auch einfach per new erzeugen können.

Mit generischer Programmierung zeigt sich ein weiteres Einsatzfeld, welches sich jedoch mit einer entsprechenden Einschränkung des Typparameters auch anderweitig lösen lässt und für mehr Unterstützung des Typsystems sorgt, da ihr für eure Zwecke weitere Einschränkungen (wie beispielsweise Schnittstellen) angeben könnt:
Objekt per Typparameter-Einschränkung erzeugen
01020304050607
public static class ObjectUtility {    public static T CreateInstance<T>() where T : new() {        return new T();    }}
Person person = ObjectUtility.CreateInstance<Person>();

Keine Werbung 👍 👎

Hin und wieder werde ich darauf angesprochen, warum ich mit diesem Blog und meinen anderen Seiten nicht ein wenig Geld verdiene. Dazu erreichen mich vereinzelt – neben sehr vielen unseriösen – auch ernsthafte Angebote.

Ich halte grundsätzlich nicht viel von Werbung als Einkommensquelle für sich. Ich verdiene mit Softwareentwicklung seit vielen Jahren meinen Lebensunterhalt und habe überhaupt kein Problem damit, für ordentliche Arbeit eine angemessene Gegenleistung zu verlangen. Aber sowohl diese Webpräsenz als auch die meisten anderen meiner Projekte sind Privatvergnügen. Das kostet mich monatlich etwa 90 € und ist für ein Hobby völlig in Ordnung.

Insofern gibt es hier auch zukünftig keinerlei bezahlte Werbung. Was ich aber durchaus mache und womit ich auch gar kein Problem habe: Wenn mir Dienstleistungen oder Produkte ernsthaft gefallen, dann mache ich dafür auch – unbezahlte – Werbung. Nicht zuletzt behandelt dieser Blog überwiegend Beiträge zur .NET-Technologie mit C#, womit beispielsweise sehr viele Verweise zu Microsoft gehen (die meine "Werbung" aber auch nicht nötig haben).

Ich bin aber auch ernsthaft davon überzeugt, dass C# eine außerordentlich gelungene Programmiersprache ist. Smiley: smiling

Vorlage für React-Testseite 👍 👎

React schnell und einfach ohne größeren Einrichtungsaufwand ausprobieren: (Skripte evtl. lokal speichern)
Testvorlage
010203040506070809101112131415161718192021222324
<!DOCTYPE html><html>    <head>        <script src="https://unpkg.com/babel-standalone/babel.min.js"></script>        <script src="https://unpkg.com/react/umd/react.production.min.js"></script>        <script src="https://unpkg.com/react-dom/umd/react-dom.production.min.js"></script>
<script type="text/babel"> class MyApp extends React.Component { render() { return <strong>Hallo, Welt!</strong>; } }
ReactDOM.render( <MyApp />, document.getElementById('app') ); </script> </head> <body> <div id="app"></div> </body></html>
Bitte beachtet jedoch, dass diese (minimalistische) Vorlage nicht für den produktiven Einsatz geeignet ist.

C#-Member als obsolet kennzeichnen 👍 👎

Hin und wieder kann es sinnvoll sein, Programmelemente (z. B. Eigenschaften oder Methoden) als obsolet zu kennzeichnen. Dies ist insbesondere bei der Umsetzung allgemeiner Programmbibliotheken hilfreich, beispielsweise um den Anwender auf eine entfallende bzw. verbesserte Funktionalität hinzuweisen.

.NET stellt hierfür das Obsolete-Attribut zur Dekoration entsprechender Teile bereit. Die Verwendung ist intuitiv:
Programmelemente als obsolet kennzeichnen
01020304050607080910111213
[Obsolete("Bitte verwenden Sie .NET-Standardfunktionalität.")]public static class Sorting {    [Obsolete("Bitte verwenden Sie zumindest " + nameof(Mergesort) + ".", true)]    public static string[] Bogosort(string[] data) {        /* ohne Implementierung */        return data;    }
public static string[] Mergesort(string[] data) { /* ohne Implementierung */ return data; }}
Bei Verwendung dieser Klasse erscheint nun folgende Warnung in Visual Studio:
"Sorting" ist veraltet: "Bitte verwenden Sie .NET-Standardfunktionalität."
Bei Verwendung der Methode Bogosort erscheint zusätzlich folgender Fehler:
"Sorting.Bogosort(string[])" ist veraltet: "Bitte verwenden Sie zumindest Mergesort."

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.

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche