Geta.Net.Extensions package contains common handlers, extension methods and other common utility methods that can be shared between multiple projects.
dotnet add package Geta.Net.Extensions
Features included in package:
CultureInfoHelpersExists(string cultureName)- Checks if there is a culture by the provided name.
GenerateRandomStringGenerateRandomString(int uppercaseChars, int lowerCaseChars, int digits, int symbols)- Generates a random string.
QueryStringBuilder- helps to build parametrized URI. Works both with absolute and relative URIsAdd(string name, string value)- adds string parameter to URLAdd(string name, object value)- adds object parameter to URLRemove(string name)- removes parameter from URL by nameToggle(string name, string value)- adds string parameter to query if it is not already present, otherwise it removes it.Toggle(string name, object value)- adds object type parameter to query if it is not already present, otherwise it removes it.ToString()- generates URL string. If URL is relative then only list of parameters are returned.
QueryStringBuilder examples:
// Initialize builder with absolute url and parameters
var builder = new QueryStringBuilder("http://domain.com/?param=value");
// Add second parameter
builder.Add("param2", "object");
// Should return http://domain.com/?param=value¶m2=object
var url = builder.ToString();// Initialize builder with relative url and parameters
var builder = new QueryStringBuilder("/?p1=o1");
// Add second parameter
builder.Add("p2", "o2");
// Should return /?p1=o1&p2=o2
var url = builder.ToString();DateTimeExtensions:ToEpochTime- Returns a Unix Epoch time;EndOfDay- Returns end of the day datetimedd.mm.yyyy 23:59:59;BeginningOfDay- Returns beginning of the day datetimedd.mm.yyyy 00:00:00;IsToday- Checks if date is today (Should be in UTC);IsTomorrow- Checks if date is tomorrow (Should be in UTC);IsYesterday- Checks if date is yesterday (Should be in UTC);ToTimestamp- Converts datetime to timestamp.
EnumerableExtensions:ForEach- Applies an action on each item of the sequence;SafeOfType- Filters the elements of an IEnumerable based on a specified type;OrEmptyIfNull- Returns empty sequence if source sequence is null otherwise returns source sequence;IsNullOrEmpty- Checks whether given sequence is null or empty;FilterPaging- Filters by page and page size;Singleton- Transforms item into IEnumerable with one item;Partition- Splits IEnumerable into multiple partitions;DistinctBy- Selects distinct values from list;Concat- Can concatenate 2 or more sequences into signle.
StringExtensions:JoinStrings- Transforms list into a separated string;GenerateSlug,GenerateSlugWithoutHyphens- Creates URL / Html friendly slug;TryParseInt32- Parses string to nullable int (Int32);TryParseInt64- Parses string to nullable long (Int64);TryParseBool- Parses string to nullable boolean;TryParseTimeSpan- Parses string to nullable TimeSpan;TryParseDecimal- Parses string to nullable decimal;IsNullOrEmpty- Answers true if this String is either null or empty;HasValue- Answers true if this String is neither null or empty;HtmlEncode- Encodes the string as HTML;HtmlDencode- Decodes an HTML string;UrlEncode- Encodes the string for URLs;UrlDecode- Decodes a URL-encoded string;IsAbsoluteUrl- Checks if a string is absolute URL;IsRelativeUrl- Checks if a string is relative URL;GetHead- Returns beginning of the string and adds ellipse...if string is longer that specified by length;GetTail- Returns ending of the string and adds ellipse...if string is longer that specified by length;Capitalize- Capitalizes every word (title case).
FluentExtensions- Provides fluent way of chaining methodsT If<T>(this T source, bool condition, Func<T, T> func)T If<T>(this T source, Func<bool> condition, Func<T, T> func)T If<T>(this T source, Func<T, bool> condition, Func<T, T> func)T Fluent<T>(this T source, Action<T> action)
Some FluentExtension examples:
var list = new List<string>()
.Fluent(l => l.Add("Hello"))
.Fluent(l => l.Add(", "))
.Fluent(l => l.Add("World!")); string value1 = null;
var value2 = string.Empty;
var value3 = "Hello";
var list = new List<string>()
.If(!string.IsNullOrEmpty(value1), l => l.FluentAdd(value1))
.If(!string.IsNullOrEmpty(value2), l => l.FluentAdd(value2))
.If(!string.IsNullOrEmpty(value3), l => l.FluentAdd(value3));var value = "Hello";
var list = new List<string>()
.If(true, l =>
l.If(() => !string.IsNullOrEmpty(value),
l1 => l1.FluentAdd(value)));AsyncExtensions- provides various extension methods to help working with async codeGetAwaiter(this CancellationToken ct)- allows toawaitonCancellationToken
Example (subscribing to GraphQL subscription and handling the message):
public async Task SubscribeAndHandleMessagesAsync(CancellationToken cancellationToken)
{
var query = "subscription { ... }";
var graphQlClient = new GraphQLHttpClient(url);
var observable = graphQlClient.CreateSubscriptionStream<ResultDto>(query);
observable
.SelectMany(r => Observable.FromAsync(() => HandleAsync(r)))
.Subscribe();
// as `Subscribe()` method exits immediately after invoke
// we have to sit here and wait until cancellation token is cancelled (from outer scope)
// having extension method `GetAwaiter` on `CancellationToken` allows us to do so
await cancellationToken;
}
private async Task<Unit> HandleAsync(GraphQLResponse<ResultDto> result)
{
// handle the message
}