| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Enhanced C# extension methods and utilities for .NET developers
🌐 Official website: https://powercsharp.net/
PowerCSharp is a comprehensive library of extension methods, utilities, and helper classes designed to enhance your C# development experience. Built by a senior C# architect with 20+ years of experience, this library provides practical, well-tested solutions for common programming challenges.
PowerCSharp v2.0.0 — Features Framework Release
PowerCSharp is organized into focused, independently versioned packages.
PowerCSharp follows a clean architectural pattern with centralized interfaces in PowerCSharp.Core:
dotnet add package PowerCSharp.Core
dotnet add package PowerCSharp.Extensions
dotnet add package PowerCSharp.Extensions.AspNetCore
dotnet add package PowerCSharp.Utilities
dotnet add package PowerCSharp.Helpers
dotnet add package PowerCSharp.Compatibilitydotnet add package PowerCSharp.Features.Abstractions
dotnet add package PowerCSharp.Features
dotnet add package PowerCSharp.BuiltInFeaturesdotnet add package PowerCSharp.Feature.Cache
dotnet add package PowerCSharp.Feature.Cache.BitFaster # in-memory LRU (BitFaster)
dotnet add package PowerCSharp.Feature.Cache.Disk # disk-backed LRUdotnet add package PowerCSharp.Feature.Sanitization.Abstractions # engine — usable standalone, no DI required
dotnet add package PowerCSharp.Feature.Sanitization # module — Features Framework + DI wiringdotnet add package PowerCSharp.Operational.Abstractions # contracts + NoOp — usable standalone, no DI required
dotnet add package PowerCSharp.Operational # diagnostics, issue capture, logging, event-log writer, retry/circuit-breakerusing PowerCSharp.Extensions;
string text = "hello world";
bool isEmpty = text.IsNullOrWhiteSpace(); // false
string title = text.ToTitleCase(); // "Hello World"
string safe = text.SafeSubstring(0, 5); // "hello"
// Additional string utilities
string camel = "HelloWorld".ToCamelCase(); // "helloWorld"
string firstLower = text.FirstCharToLowerCase(); // "hello world"
string mid = text.Mid(6); // "world"
string normalized = "User Name".NormalizeKey(); // "userName"
string ascii = "café".AsAscii(); // "caf"
bool isValid = "https://example.com".IsValidUrl(); // trueusing PowerCSharp.Extensions;
var numbers = new List<int> { 1, 2, 3, 4, 5 };
bool isEmpty = numbers.IsNullOrEmpty(); // false
var first = numbers.FirstOrDefaultSafe(-1); // 1
var page = numbers.Page(1, 2); // [1, 2]
// New collection utilities
var list = new List<string> { "keep", "remove", "keep", "remove" };
int removed = list.RemoveAll(x => x == "remove"); // 2using PowerCSharp.Extensions;
var date = DateTime.Now;
int age = date.GetAge();
bool isWeekend = date.IsWeekend();
var firstDay = date.FirstDayOfMonth();
var lastDay = date.LastDayOfMonth();using PowerCSharp.Extensions.AspNetCore;
using System.Net;
// HTTP Status Code utilities
HttpStatusCode status = HttpStatusCode.OK;
bool success = status.IsSuccessful(); // true
bool clientError = status.IsClientError(); // false
bool serverError = status.IsServerError(); // false
bool isRedirect = status.IsRedirect(); // false
// URI manipulation
Uri uri = new Uri("https://example.com");
Uri withParam = uri.AddParameter("search", "test"); // https://example.com?search=test
// HTTP Request cloning
using var request = new HttpRequestMessage(HttpMethod.Get, "https://api.example.com");
var clonedRequest = request.Clone();
var clonedAsync = await request.CloneAsync();using PowerCSharp.Extensions.AspNetCore;
using Microsoft.Extensions.Configuration;
var configuration = new ConfigurationBuilder().Build();
var options = configuration.GetOptions<MyAppOptions>("MyApp"); // Reads from "MyApp" section// Program.cs
builder.Services.AddPowerFeatures(builder.Configuration, options =>
{
options.AddBuiltInFeatures(); // opt-in the built-in bundle (CORS, etc.)
options.ScanAssemblies( // opt-in pluggable feature assemblies
typeof(CacheFeatureModule).Assembly);
options.Override("Cache", true); // optional code-level override
options.EnableDiagnosticsEndpoint(); // GET /power-features — off by default
});
var app = builder.Build();
app.UsePowerFeatures();// appsettings.json
{
"PowerFeatures": {
"Cors": { "Enabled": true, "AllowedOrigins": [ "https://example.com" ] },
"Cache": { "Enabled": true, "Provider": "BitFaster", "Capacity": 1000 }
}
}Flag resolution order (highest precedence first): explicit code override → custom IFeatureFlagProvider → environment variables (POWERFEATURES__<KEY>__ENABLED) → appsettings → feature default.
// Resolves to the active provider (BitFaster or Disk) or NoOp if disabled.
var cache = app.Services.GetRequiredService<ICacheService>();
await cache.SetAsync("key", myObject, TimeSpan.FromMinutes(5));
var result = await cache.GetAsync<MyObject>("key");
if (result.Hit)
Console.WriteLine(result.Value);using PowerCSharp.Feature.Sanitization.Abstractions;
// Usable standalone — no DI or feature registration required.
string safeForLog = untrustedInput.SanitizeForLog(); // CWE-117 log injection
string safeForPath = untrustedSegment.SanitizeForFilePath(); // CWE-22 path traversal (throws if rejected)
string masked = payload.SanitizeForSensitiveData(); // CWE-200 sensitive-data masking
string safePattern = untrustedPattern.SanitizeForRegexInjection(); // CWE-400/CWE-730 ReDoS validation
// Or resolve the DI-facing service once PowerCSharp.Feature.Sanitization is registered:
var sanitizer = app.Services.GetRequiredService<ISanitizationService>();
var result = sanitizer.SanitizeForLogInjection(untrustedInput);// Program.cs
builder.Services.AddOperational(builder.Configuration);
// ...
app.UseOperational();using PowerCSharp.Operational.Abstractions;
public class OrderController(IDiagnosticsService diagnostics, IIssueManager issues)
{
public IActionResult Get(int id)
{
diagnostics.AddTrace($"Looking up order {id}");
try
{
return Ok(GetOrder(id));
}
catch (Exception ex)
{
issues.CaptureException(ex, new { orderId = id });
throw;
}
}
}Enable per-request diagnostics with the debug: true header (add debugVerbose: true to disable auto-obfuscation, traceLevel: <0-6> to filter, eventLog: true to also write to disk). Disabled or unconfigured, PowerCSharp.Operational.Abstractions NoOp floors keep every call site safe.
using PowerCSharp.Extensions;
// Dynamic expression parsing
string expression = "Age > 18 && Name.Contains('John')";
var predicate = expression.GetExpressionDelegate<Person>();
// Dynamic ordering
string orderExpression = "Name DESC, Age ASC";
var orderDelegates = orderExpression.GetOrderDelegates<Person>();
// Dynamic filtering and ordering
var filterProvider = new DynamicFilterProvider<Person>();
var orderProvider = new DynamicOrderProvider<Person>();
var filtered = people.Filter(filterProvider);
var ordered = people.Order(orderProvider);using PowerCSharp.Extensions;
using System.Text.Json;
// JSON element access
JsonElement element = JsonDocument.Parse("{\"name\":\"John\"}").RootElement;
var name = element.Get("name"); // JsonElement with value "John"
var firstItem = element.Get(0); // For arrays
// Case-insensitive JSON access
bool found = element.TryGetPropertyCaseInsensitive("NAME", out var value);
// XML flattening
using System.Xml.Linq;
XElement xml = XElement.Parse("<root><child>value</child></root>");
var dict = xml.Flatten(); // Dictionary with XML structureusing PowerCSharp.Extensions;
// Object utilities
string text = "test";
text.ThrowOnNull(); // Throws if null
bool isTrue = "true".TryGetBool(out bool result); // result = true, isTrue = true
bool isFalse = "0".TryGetBool(out result); // result = false, isFalse = true
// Generic operations
var person = new Person { Name = "John", Age = 30 };
var copy = new Person();
person.CopyPropertiesTo(copy); // Copies matching properties
// Type operations
bool isDefault = default(int).IsDefault(); // true
string typeName = typeof(List<string>).GetGenericTypeName(); // "List<String>"
// Concrete type resolution
Type concreteType = typeof(IMyInterface).GetConcreteType();using PowerCSharp.Extensions;
using var originalStream = new MemoryStream(Encoding.UTF8.GetBytes("test data"));
using var destinationStream = new MemoryStream();
await originalStream.CloneAsync(destinationStream);
// destinationStream now contains the same data as originalStreamusing PowerCSharp.Extensions;
var person = new { Name = "John", Age = 30, Email = "john@example.com" };
string hash = person.ComputeHash(); // "A1B2C3D4E5F67890" (16-char hex string)
// Handles complex objects with nested properties
var complexObj = new Order
{
Id = 123,
Customer = new Customer { Name = "Alice" },
Items = new List<Item> { new Item { Name = "Product1" } }
};
string orderHash = complexObj.ComputeHash(); // Consistent hash for caching/identificationusing PowerCSharp.Extensions;
string basePath = "/var/www/uploads";
string userFile = "../../etc/passwd"; // Malicious attempt
// This will throw SecurityException due to directory traversal attempt
string safePath = PathExtensions.CombineAndValidate(basePath, userFile);
// Safe usage with valid relative paths
string validPath = PathExtensions.CombineAndValidate(basePath, "images/photo.jpg");
// Returns: "/var/www/uploads/images/photo.jpg"
// Multiple path segments
string multiPath = PathExtensions.CombineAndValidate(basePath, "documents", "2023", "report.pdf");
// Returns: "/var/www/uploads/documents/2023/report.pdf"using PowerCSharp.Utilities;
bool isValidEmail = ValidationHelper.IsValidEmail("user@example.com");
bool isNumeric = ValidationHelper.IsNumeric("12345");
bool isValidUrl = ValidationHelper.IsValidUrl("https://example.com");using PowerCSharp.Utilities;
string content = FileHelper.SafeReadAllText("file.txt");
bool success = FileHelper.SafeWriteAllText("output.txt", "Hello World");
string size = FileHelper.GetFileSize(1024 * 1024); // "1 MB"using PowerCSharp.Helpers;
var obj = new { Name = "John", Age = 30 };
string json = JsonHelper.SafeSerialize(obj);
var deserialized = JsonHelper.SafeDeserialize<MyClass>(json);
string pretty = JsonHelper.PrettyPrint(json);using PowerCSharp.Helpers;
string sha256 = CryptoHelper.ComputeSHA256("password");
string md5 = CryptoHelper.ComputeMD5("data");
string random = CryptoHelper.GenerateRandomString(10);All PowerCSharp packages include comprehensive unit tests. Run tests with:
dotnet testCore libraries
Features framework
Cache feature family
Sanitization feature family
Operational package family
Contributions are welcome! Please read our Contributing Guidelines for details.
This project is licensed under the MIT License - see the LICENSE file for details.
PowerCSharp - Making C# development more powerful, one extension at a time! 🚀
| Back | FazBrowse Home | New Git URL |