A comprehensive collection of extension methods for .NET base types, designed to enhance productivity, type safety, and code readability in modern .NET applications.
- String Extensions: Null-safe string operations and character manipulation
- Numeric Extensions: Generic numeric operations for all
INumber<T>types including angles, percentages, and clamping - Enum Extensions: Flag manipulation, description retrieval, and comprehensive enum utilities
- Collection Extensions: Advanced dictionary, list, and enumerable operations with synchronization support
- Temporal Extensions: Date and time utilities for
DateTime,DateOnly, andTimeOnly - Reflection & Assembly: Type discovery, attribute scanning, and embedded resource management
- Comparison Extensions: Enhanced operations for
IComparable<T>types - Specialized Utilities: Extensions for
Byte,Guid,Version,Task, andRandomtypes
usingPlugin.BaseTypeExtensions;// Null-safe string operationsstring?input=GetUserInput();stringresult=input.NullIfEmptyOrWhiteSpace()??"default value";// Character filteringstringclean="Hello@World!#123".RemoveSpecialCharacters();// "HelloWorld123"usingPlugin.BaseTypeExtensions;// Angle conversions (works with any INumber<T>)doubleradians=45.0.DegreeToRadian();floatdegrees=1.57f.RadianToDegree();// Range operationsintclamped=value.Clamp(0,100);doublepercentage=75.0.PercentageToValue(0.0,200.0);// 150.0bytenormalized=0.75.PercentageToByte();// 191// Custom numeric rangesvarrange=NumericRangeTools.GetRange(0.0,10.0,0.5);foreach(varvalueinrange){/* 0.0, 0.5, 1.0, ... 10.0 */}usingPlugin.BaseTypeExtensions;[Flags]publicenumFilePermissions{None=0,Read=1,Write=2,Execute=4}// Flag operationsvarpermissions=FilePermissions.None.SetFlag(FilePermissions.Read).SetFlag(FilePermissions.Write);boolcanWrite=permissions.HasFlag(FilePermissions.Write);permissions=permissions.UnsetFlag(FilePermissions.Write);// Get all enum valuesvarallPermissions=EnumExtensions.AllAsArray<FilePermissions>();// Description support[Description("Read access to files")]publicenumAccess{[Description("Read access")]Read}stringdesc=Access.Read.GetDescription();// "Read access"usingPlugin.BaseTypeExtensions;// Dictionary operationsvardict=newDictionary<string,int>();dict.Add(newKeyValuePair<string,int>("key",42));dict.Update(newKeyValuePair<string,int>("key",100));// Collection synchronizationsourceList.UpdateFrom(targetList,matcher:(s,t)=>s.Id==t.Id,onAdd: item =>Console.WriteLine($"Added: {item}"),onRemove: item =>Console.WriteLine($"Removed: {item}"));// Safe enumerable operationsvaritems=GetItems();varcount=items.NullIfEmpty()?.Count();// null if empty, count otherwisevaritem=items.GetOrDefault(index:5,defaultValue:newItem());// Queue with size limitvarqueue=newConcurrentQueue<string>();queue.Enqueue("item",maxSize:10);// automatically dequeues if over limitusingPlugin.BaseTypeExtensions;// Date range calculationsvarstart=newDateTime(2024,1,1);varend=newDateTime(2024,12,31);varcurrent=newDateTime(2024,6,15);doubleprogress=current.DateTimeToPercentage(start,end);// ~0.5varhalfwayPoint=0.5.PercentageToDateTime(start,end);// Works with DateOnly and TimeOnly toovardateProgress=DateOnly.FromDateTime(current).DateOnlyToPercentage(DateOnly.FromDateTime(start),DateOnly.FromDateTime(end));usingPlugin.BaseTypeExtensions;// Get assembly from instancevarassembly=myObject.GetAssembly();// Find types with attributesvartypesWithAttribute=assembly.GetTypesWithAttribute<ServiceAttribute>();foreach(var(attribute,type)intypesWithAttribute){Console.WriteLine($"Service: {type.Name}");}// Async version availablevarasyncTypes=awaitassembly.GetTypesWithAttributeAsync<ServiceAttribute>();// Extract embedded resourcesvarresourceFile=assembly.MoveManifestResourceToCache("MyApp.Resources.config.json",filename:"app-config.json",fileAlreadyExistsBehavior:FileAlreadyExistsBehavior.Overwrite);// Async resource extractionvarasyncResource=awaitassembly.MoveManifestResourceToDirectoryAsync("MyApp.Resources.template.html",targetDirectory:"/tmp/app-resources");usingPlugin.BaseTypeExtensions;// Fluent comparisonsboolinRange=value.IsBetween(min,max,inclusive:true);boolisGreater=score.IsGreaterThan(threshold);boolisValid=price.IsGreaterThanOrEqual(0);// Utility functionsvarminimum=ComparableTools.Min(value1,value2);varmaximum=ComparableTools.Max(value1,value2);usingPlugin.BaseTypeExtensions;// Byte operationsbytevalue=0xAB;stringbits=value.ToBitsString();// "10101011"bytereversed=value.ToReversedByte();// 0xD5byteupperNibble=value.GetUpperNibbleBitsAsNewByte();// 0xA0// GUID utilitiesvarguid=Guid.NewGuid();varnextGuid=guid.GetPlusOne();// Sequential GUID// Version operationsvarversion=newVersion(1,2,3);// Version comparison and manipulation methods available// Task extensionsvartcs=newTaskCompletionSource<string>();// Enhanced TaskCompletionSource operations// Random extensionsvarrandom=newRandom();// Additional random generation methodsStringExtensions- Null-safe operations and character manipulationNumericExtensions- Generic numeric operations forINumber<T>typesEnumExtensions- Flag operations, descriptions, and enumeration utilitiesDictionaryExtensions- Dictionary operations and synchronizationListExtensions- List manipulation and utilitiesEnumerableExtensions- Collection operations and safe access methodsDateTimeExtensions- DateTime range and percentage calculationsDateOnlyExtensions- DateOnly-specific operationsTimeOnlyExtensions- TimeOnly-specific operationsReflectionExtensions- Type discovery and attribute scanningAssemblyExtensions- Resource extraction and assembly utilitiesComparableExtensions- Enhanced comparison operationsByteExtensions- Bit manipulation and byte operationsGuidExtensions- GUID utilities and operationsVersionExtensions- Version comparison and manipulationTaskExtensions- Task and async operation helpersTaskCompletionSourceExtensions- Enhanced TaskCompletionSource operationsRandomExtensions- Additional random generation methods
ComparableTools- Static utility methods for comparable typesNumericRangeTools- Range generation for numeric types
- Type Safety: Generic constraints ensure compile-time safety and prevent runtime errors
- Performance: Optimized with modern .NET features, aggressive inlining, and efficient algorithms
- Null Safety: Explicit null handling with clear, predictable behavior
- Consistency: Uniform naming conventions and parameter patterns across all extensions
- Extensibility: Generic implementations work with user-defined types that implement required interfaces
- Modern .NET: Built for .NET 9 with latest C# language features and best practices
- Testing: xUnit + FluentAssertions with 90%+ code coverage
- Performance: Benchmarked with BenchmarkDotNet for critical paths
- Build:
dotnet build - Test:
dotnet test - Coverage:
dotnet test --collect:"XPlat Code Coverage" - Framework: .NET 9.0
MIT — see LICENSE.md for details.
Designed for modern .NET applications requiring powerful, type-safe base type extensions.