Skip to content

Nextended.Core

📚 Vollständige API-Referenz — jeder öffentliche Typ und Member, erzeugt aus der kompilierten Assembly.

🇬🇧 This page in English

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.

NuGet

Installation

bash
dotnet add package Nextended.Core

Nextended.Core hat keine Nextended-Abhängigkeiten — jedes andere Paket der Sammlung baut darauf auf.

Was drin ist

BereichInhalt
Extension Methodsstring, DateTime/TimeSpan, IEnumerable<T>, Type, MemberInfo, object, Task, Stream, Uri, FileInfo, Assembly, HttpClient, Expression
Eigene TypenMoney, Currency, Date, BaseId, SuperType, Range<T>, SimpleRange, DataUrl, Hierarchical<T>, Quote
Class MappingMapTo<T>(), MapElementsTo<T>(), MapToAsync<T>() mit ClassMappingSettings — ohne Fremdbibliothek, ohne Profilregistrierung
Deep CloneCloneDeep<T>() mit Klonstufen, Ignorier-Attributen und Referenzerhaltung
Facettierte SucheFacetBuilder erzeugt Facettengruppen (Terme, Bereiche, Abhängigkeiten) aus IQueryable<T> und formatiert sie als OData-Literale
ODataODataQueryModel, Expression-Visitor und Operator-Parsing, um OData-Abfragen in Ausdrücke zu übersetzen
Verschlüsselung & HashingAesEncryption, RijndaelEncryption, HashHelper, StringHasher sowie Base64- und Hex-Encoder
BeobachterCollectionWatcher, PropertyWatcher, ProcessWatcher
BenachrichtigungNotificationObject als INotifyPropertyChanged-Basis
ReflectionReflectionHelper, TypeExtender, PropertyPath, ExposedObject, SimpleConvert
ZeitmessungMeasure.Run(...) / Measure.RunAsync(...) liefern Ergebnis und Dauer zusammen
Generierungs-Attribute[AutoGenerateDto], [AutoGenerateCom], [IgnoreOnGeneration], [GenerationPropertySetting]

Class Mapping

Konventionsbasiert, ohne Konfiguration:

csharp
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:

csharp
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:

csharp
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

csharp
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

csharp
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);
TypZweck
MoneyBetrag und Währung zusammen, in Dezimalgenauigkeit — kein double für Geld
CurrencyWährungen samt Symbol und Nachkommastellen
DateReines Datum. Beseitigt die Fehlerklasse „welche Mitternacht in welcher Zeitzone"
BaseIdStark typisierte ID-Hülle, damit eine UserId nicht versehentlich als OrderId durchgeht
SuperTypeEntitätstyp mit Untertyp-Beziehungen
Range<T> / SimpleRangeIntervalle mit Überschneidungs- und Enthaltensein-Prüfung
Hierarchical<T>Baumstruktur mit Eltern-/Kind-Navigation und Flatten
DataUrldata:-URLs parsen und erzeugen

Ausführlich: Typreferenz (englisch).

Extension Methods

Zeichenketten

csharp
"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

csharp
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.

csharp
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

csharp
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

csharp
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

csharp
// Ä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

csharp
// 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.0
  • netstandard2.1
  • net8.0
  • net9.0
  • net10.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.