Nextended.Core
📚 Vollständige API-Referenz — jeder öffentliche Typ und Member, erzeugt aus der kompilierten Assembly.
Die Basisbibliothek der Sammlung: Extension Methods, eigene Typen, Class Mapping, Deep Clone, facettierte Suche, Verschlüsselung und Hashing sowie die Attribute, die Nextended.CodeGen auswertet.
Installation
dotnet add package Nextended.CoreNextended.Core hat keine Nextended-Abhängigkeiten — jedes andere Paket der Sammlung baut darauf auf.
Was drin ist
| Bereich | Inhalt |
|---|---|
| Extension Methods | string, DateTime/TimeSpan, IEnumerable<T>, Type, MemberInfo, object, Task, Stream, Uri, FileInfo, Assembly, HttpClient, Expression |
| Eigene Typen | Money, Currency, Date, BaseId, SuperType, Range<T>, SimpleRange, DataUrl, Hierarchical<T>, Quote |
| Class Mapping | MapTo<T>(), MapElementsTo<T>(), MapToAsync<T>() mit ClassMappingSettings — ohne Fremdbibliothek, ohne Profilregistrierung |
| Deep Clone | CloneDeep<T>() mit Klonstufen, Ignorier-Attributen und Referenzerhaltung |
| Facettierte Suche | FacetBuilder erzeugt Facettengruppen (Terme, Bereiche, Abhängigkeiten) aus IQueryable<T> und formatiert sie als OData-Literale |
| OData | ODataQueryModel, Expression-Visitor und Operator-Parsing, um OData-Abfragen in Ausdrücke zu übersetzen |
| Verschlüsselung & Hashing | AesEncryption, RijndaelEncryption, HashHelper, StringHasher sowie Base64- und Hex-Encoder |
| Beobachter | CollectionWatcher, PropertyWatcher, ProcessWatcher |
| Benachrichtigung | NotificationObject als INotifyPropertyChanged-Basis |
| Reflection | ReflectionHelper, TypeExtender, PropertyPath, ExposedObject, SimpleConvert |
| Zeitmessung | Measure.Run(...) / Measure.RunAsync(...) liefern Ergebnis und Dauer zusammen |
| Generierungs-Attribute | [AutoGenerateDto], [AutoGenerateCom], [IgnoreOnGeneration], [GenerationPropertySetting] |
Class Mapping
Konventionsbasiert, ohne Konfiguration:
using Nextended.Core.Extensions;
var dto = user.MapTo<UserDto>(); // ein Objekt
var dtos = users.MapElementsTo<UserDto>(); // eine ganze Sequenz
var async = await user.MapToAsync<UserDto>();Wenn die Konventionen nicht reichen, konfigurieren Sie über ClassMappingSettings:
var settings = ClassMappingSettings.Default
// Namen weichen ab
.AddAssignment<User, UserDto>(u => u.EmailAddress, d => d.Mail)
// Feld nie übertragen
.IgnoreProperties<User>(u => u.Password)
// eigener Typkonverter
.AddConverter<string, DateTime>(DateTime.Parse);
var mapped = user.MapTo<UserDto>(settings);Einzelne Schalter setzen Sie inline mit Set:
var lenient = ClassMappingSettings.Default.Set(s => s.IgnoreExceptions = true);
var withFields = ClassMappingSettings.Default.Set(s => s.IncludePrivateFields = true);Weitere Bausteine: AddTypeMapping<TIn, TOut>(), AddAllLoadedTypeConverters(), AddGlobalConverter<TIn, TOut>() für prozessweite Konverter und SetAsDefault(), um eine Konfiguration zum Standard zu machen.
Verkettete Zuweisungsform
Es gibt zusätzlich Assign(...).To(...).And(...). Diese Kette liefert ein Tuple<ClassMappingSettings, …> und nicht das Settings-Objekt. Entweder .Item1 nehmen oder AddAssignment verwenden.
Ausführlich: Class-Mapping-Referenz (englisch).
Deep Clone
using Nextended.Core.DeepClone;
var copy = order.CloneDeep();Der komplette Graph wird kopiert, Referenzen bleiben erhalten, Zyklen sind unproblematisch. Was nie mitkopiert werden soll, markieren Sie mit [ClonerIgnore]. Über ClonerSettings und CloneLevel steuern Sie die Tiefe.
Methodenname
Die Methode heißt CloneDeep(), nicht DeepClone().
Eigene Typen
using Nextended.Core.Types;
var price = new Money(99.99m, Currency.USD);
var due = Date.Today.AddDays(30); // Datum ohne Zeitanteil
var span = new Range<int>(1, 10);| Typ | Zweck |
|---|---|
Money | Betrag und Währung zusammen, in Dezimalgenauigkeit — kein double für Geld |
Currency | Währungen samt Symbol und Nachkommastellen |
Date | Reines Datum. Beseitigt die Fehlerklasse „welche Mitternacht in welcher Zeitzone" |
BaseId | Stark typisierte ID-Hülle, damit eine UserId nicht versehentlich als OrderId durchgeht |
SuperType | Entitätstyp mit Untertyp-Beziehungen |
Range<T> / SimpleRange | Intervalle mit Überschneidungs- und Enthaltensein-Prüfung |
Hierarchical<T> | Baumstruktur mit Eltern-/Kind-Navigation und Flatten |
DataUrl | data:-URLs parsen und erzeugen |
Ausführlich: Typreferenz (englisch).
Extension Methods
Zeichenketten
"hello world".ToPascalCase(); // "HelloWorld"
"hello world".ToCamel(); // "helloWorld"
"MyClassName".SplitByUpperCase(); // "My Class Name"
"ein langer Satz".ToEllipsis(8); // "ein lang…"
"abc".EnsureEndsWith("/"); // "abc/"
"abc".EnsureStartsWith("/"); // "/abc"
"user@example.com".IsEmailAddress();
"a,b,c".JoinWith("-", "d");
text.HasValue(); // nicht null und nicht leer
text.ThrowIfNullOrEmpty();
text.GetLines();
text.Capitalize();
text.Uncapitalize();Datum und Zeit
DateTime.Today.AddWeekDays(5); // überspringt Wochenenden
DateTime.Today.IsWeekend();
DateTime.Today.IsWeekday();
DateTime.Today.FirstDayOfMonth();
DateTime.Today.LastDayOfMonth();
DateTime.Today.Next(DayOfWeek.Monday);
DateTime.Today.Previous(DayOfWeek.Friday);
DateTime.Today.FindWeekNumber();
start.MonthsBetween(end);
DateTime.UtcNow.ToISOz();
DateTime.UtcNow.ToUnixTimeStamp();
DateTime.UtcNow.ToHttpDate();Nicht vorhanden
ToCamelCase(), ToSnakeCase(), ToKebabCase(), DeepClone(), AddBusinessDays() und IsBusinessDay() gibt es nicht — sie standen fälschlich in älteren Fassungen dieser Dokumentation. Richtig sind ToCamel(), CloneDeep(), AddWeekDays() sowie IsWeekend() und IsWeekday().
Vollständige Liste: Extension-Method-Referenz (englisch).
Facettierte Suche
FacetBuilder baut aus einer Abfrage die Facettengruppen für eine Suchoberfläche — Terme mit Trefferzahlen, Zahlen- und Datumsbereiche in Buckets, abhängige Gruppen — und formatiert die Werte so, dass sie als OData-Filter zurückgeschickt werden können.
using Nextended.Core.Facets;
var facets = await new FacetBuilder()
.WithOptions(o => o.MaxOptionsPerGroup = 20)
.WithLocalizationFunc(key => localizer[key])
.BuildAsync<Product>(products);Welche Eigenschaften Facetten werden, markieren Sie mit [ProvideFacet]. Ergebnis ist eine Liste von FacetGroup mit FacetOption-Einträgen; AppliedFacet beschreibt die aktive Auswahl. Nextended.Web serialisiert das über FacetResourceSetSerializer direkt in eine OData-Antwort.
Verschlüsselung und Hashing
using Nextended.Core.Encryption;
using Nextended.Core.Hashing;
var cipher = "geheim".Encrypt("passwort");
var plain = cipher.Decrypt("passwort");
var hash = "text".ToSha256();
var md5 = HashHelper.GetHash("text", HashAlgorithmName.MD5);AesEncryption und RijndaelEncryption als Implementierungen, Base64 und Hex als Encoder. Ausführlich: Verschlüsselung und Hashing (englisch).
Zeitmessung
using Nextended.Core.Measurement;
var measured = await Measure.RunAsync(() => repository.LoadAllAsync());
Console.WriteLine($"{measured.Elapsed} für {measured.Result.Count} Zeilen");Das Ergebnis kommt zusammen mit der Dauer zurück — kein separates Stopwatch-Gerüst um den Aufruf.
Beobachter und Benachrichtigung
// Änderungen an einer Auflistung verfolgen
var watcher = new CollectionWatcher<Order>(orders);
// Eine Eigenschaft eines beliebigen Objekts beobachten
var prop = new PropertyWatcher(settings, nameof(settings.Theme));
// Basisklasse mit INotifyPropertyChanged
public class MyViewModel : NotificationObject
{
private string _name;
public string Name { get => _name; set => Set(ref _name, value); }
}Reflection und dynamischer Zugriff
// Auf nicht öffentliche Member zugreifen, ohne Reflection-Code zu schreiben
dynamic exposed = ExposedObject.From(instance);
exposed.privateField = 42;
// Pfad über mehrere Ebenen
var value = PropertyPath.GetValue(order, "Customer.Address.City");
// Typen zur Laufzeit erweitern
var extended = TypeExtender.CreateType(baseType, additionalProperties);
// Robuste Konvertierung
var number = SimpleConvert.To<int>("42");Unterstützte Frameworks
netstandard2.0netstandard2.1net8.0net9.0net10.0
Plattform
Plattformübergreifend.
Abhängigkeiten
Keine Nextended-Abhängigkeiten — dieses Paket ist die Wurzel des Abhängigkeitsbaums.
Migration von nExt
Nextended.Core ist die Fortsetzung von nExt.Core. Die Namespaces heißen jetzt Nextended.*, die API ist ansonsten quellkompatibel. Siehe den Migrationsleitfaden(englisch). Das Altpaket nExt.Core wird nicht mehr gepflegt.