Target Frameworks: netstandard2.0, net9.0, net10.0
The foundation library for .NET development, providing a comprehensive collection of common utilities, extension methods, and helpers. Multi-targeting ensures compatibility with a wide range of .NET applications, from .NET Framework 4.7.2+ to the latest .NET versions.
Atc eliminates boilerplate code and provides battle-tested implementations for common tasks. Instead of writing the same utility code in every project, Atc provides:
- Rich Extension Methods: Extensions for all common .NET types (String, DateTime, Enum, Collections, etc.)
- Logging Utilities: Structured logging helpers for ILogger
- Data Structures: Specialized collections and data structures
- Serialization Helpers: JSON serialization utilities with sensible defaults
- Math & Geometry: Math operations, geospatial calculations, and coordinate systems
- Networking Helpers: Network information and IP address utilities
Perfect for:
- Reducing boilerplate in business applications
- Standardizing common operations across projects
- Improving code readability with expressive extension methods
- Building reusable libraries
dotnet add package Atc- .NET Standard 2.1
- .NET 9.0
The library multi-targets to provide broad compatibility with:
- .NET Framework 4.7.2+
- .NET Core 2.1+
- .NET 5+
- .NET 9.0
- Microsoft.Extensions.Logging.Abstractions
- System.Text.Json
- System.ComponentModel.Annotations
- Meziantou.Polyfill (for backward compatibility)
Organized by category:
- BaseTypes: String, Int, Double, Bool, Enum, DateTime, TimeSpan
- Collections: List, Dictionary, IEnumerable, Array
- Reflection: Type, Assembly, MethodInfo
- Serialization: JSON serialization helpers
- Stream: Stream and byte array operations
ILoggerextensions for structured loggingLogKeyValueItemfor key-value pair loggingLogItemFactoryfor creating log items
MathEx: Extended math operations- GeoSpatial calculations and coordinates
- Cartesian and geographic coordinate systems
NetworkInformationHelper: Network connectivity and IP address utilitiesJsonSerializerOptionsFactory: Preconfigured JSON serialization options
- Specialized collections
- Custom data structures for common scenarios
Localized resources for:
- English (default)
- Danish (da-DK)
- German (de-DE)
// Collect data
var logItems = new List<LogKeyValueItem>
{
new LogKeyValueItem(LogCategoryType.Error, "Key1", "Error1"),
new LogKeyValueItem(LogCategoryType.Warning, "Key2", "Warning1"),
new LogKeyValueItem(LogCategoryType.Information, "Key3", "Information1"),
LogItemFactory.CreateError("Key4", "Error2"),
LogItemFactory.CreateWarning("Key5", "Warning2"),
LogItemFactory.CreateInformation("Key6", "Information2"),
};
// Log data
logger.LogKeyValueItems(logItems); // Collect data
var logItem = LogItemFactory.CreateError("Key1", "Error1");
// Log data
logger.LogKeyValueItem(LogItemFactory.CreateError(logItem));The default value for decimalPrecision is 3.
var stopwatch = Stopwatch.StartNew();
DoSomthingThatTakesLongTime();
stopwatch.Stop();
Console.WriteLine($"Running time: {stopwatch.Elapsed.GetPrettyTime()}");Result format could look like:
Running time: 14,015 sec
Running time: 13,234 min
Running time: 12,213 hoursThis helper method ask a external internet service (GoogleDNS ping), to see it there is connection.
bool hasConnection = NetworkInformationHelper.HasConnection()This helper method ask a external internet service (ipify.org), to get the external ip address.
IPAddress? ipAddress = NetworkInformationHelper.GetPublicIpAddress()string result = "hello world".EnsureFirstCharacterToUpper();
// Result: "Hello world"bool isDigit = "12345".IsDigit(); // true
bool isNumeric = "123.45".IsNumeric(); // true
bool isEmail = "user@example.com".IsEmailAddress(); // true
bool isGuid = "550e8400-e29b-41d4-a716-446655440000".IsGuid(); // truestring longText = "This is a very long text that needs truncation";
string short = longText.Truncate(20);
// Result: "This is a very lo..."string title = "hello world".ToTitleCase(); // "Hello World"
string pascal = "hello world".ToPascalCase(); // "HelloWorld"
string camel = "HelloWorld".ToCamelCase(); // "helloWorld"public enum Status
{
[Description("Currently Active")]
Active,
[Description("Temporarily Inactive")]
Inactive
}
Status status = Status.Active;
string name = status.GetName(); // "Active"
string description = status.GetDescription(); // "Currently Active"Status status = EnumExtensions.GetEnumValue<Status>("Active");
// Result: Status.Active
// With description
Status statusFromDescription = EnumExtensions.GetEnumValueFromDescription<Status>("Currently Active");
// Result: Status.Activevar list = new List<string> { "apple", "banana" };
list.AddIfNotContains("orange"); // Adds "orange"
list.AddIfNotContains("apple"); // Does nothing, already existsvar numbers = new List<int> { 1, 2, 3, 4, 5 };
numbers.ForEach(n => Console.WriteLine(n * 2));List<string>? list = null;
bool isEmpty = list.IsNullOrEmpty(); // true
list = new List<string>();
isEmpty = list.IsNullOrEmpty(); // true
list.Add("item");
isEmpty = list.IsNullOrEmpty(); // falseDateTime birthDate = new DateTime(1990, 5, 15);
int age = birthDate.GetAge(); // Current age in yearsDateTime past = DateTime.Now.AddMinutes(-45);
string diff = past.GetPrettyTimeDiff();
// Result: "45 minutes ago"DateTime now = DateTime.Now;
DateTime start = DateTime.Now.AddHours(-1);
DateTime end = DateTime.Now.AddHours(1);
bool isBetween = now.IsBetween(start, end); // trueusing Atc.Serialization;
// Create default options
var options = JsonSerializerOptionsFactory.Create();
// Serialize with camelCase
var json = JsonSerializer.Serialize(myObject, options);
// Deserialize
var obj = JsonSerializer.Deserialize<MyType>(json, options);using Atc.Math.GeoSpatial;
var coordinate1 = new CartesianCoordinate(55.6761, 12.5683); // Copenhagen
var coordinate2 = new CartesianCoordinate(51.5074, -0.1278); // London
// Calculate distance in kilometers
double distance = coordinate1.DistanceTo(coordinate2);Contributions are welcome! Please see the main repository README for contribution guidelines.