Skip to content

kirides/csharp-SimpleLibraries

Repository files navigation

csharp-SimpleLibraries

Collection of small - single-".cs" libraries.


Kirides.Libs.Events.EventAggregator

After having the need for a simple loosely coupled eventing system, and a little bit of boredom i decided to look up what it needs to create an simple EventAggregator implementation.

It ..

  • supports any type of class for its payload (also primitive types!).
  • can unsubscribe via an ISubscriptionToken or via the callback you used while subscribing.
  • is threadsafe.
  • can handle UI-Dispatching for WPF (System.Windows.Threading.Dispatcher) and Windows Forms (SychronizationContext, limited to thread on which the subscription was made).
  • has no external dependencies (WindowsBase.dll and PresentationFramework.dll for Dispatcher.).
  • built for .Net Framework 4+ (ConcurrentDictionary<K,V>).
// IEventAggregator: ISubscriptionToken Subscribe<TPayload>(Action<TPayload> callback); ISubscriptionToken Subscribe<TPayload>(Action<TPayload> callback, ThreadOption threadOption); void Publish<TPayload>() where TPayload : new(); void Publish<TPayload>(TPayload payload); void Unsubscribe<TPayload>(Action<TPayload> callback); void Unsubscribe(ISubscriptionToken token); // ISubscriptionToken void Dispose();

Credits to "user1548266" and "mike z" from StackOverflow

  • "user1548266" for having ask the question: "WeakReference is dead"
  • "mike z" for the implementation of the "Subscriber.Invoke<>"-Method.
    This part kept me going for days until i found out that the Compiler does funny stuff with the handed Callbacks.

Reference: http://stackoverflow.com/questions/20169296/weakreference-is-dead


Kirides.Libs.Configuration.IniConfig

A relatively small and easy to use Ini-File class

It..

  • can return values with a different type than string, using the IIniSection.GetValue<T>(...)-Method.
  • can read and write sections/keys/values.
  • supports the following syntax: IIniConfig["Section"]["Key"] for accessing and altering the value of a key. alternatively you can use the IIniConfig.GetSection("Section").GetValue<T>("Key")-syntax.
//IniConfig: public static IIniConfig FromFile(string filePath) {...} public static IIniConfig FromString(string ini) {...} // IIniConfig: IIniSection this[string section] { get; } IIniSection GetSection(string section); void RemoveSection(string section); IIniSection AddSection(string section); void SaveToFile(string fileName); // IIniSection string Name { get; } IDictionary<string, object> KeyValuePairs { get; } T GetValue<T>(string key); string GetValue(string key); string this[string key] { get; set; } void AddOrReplace(string key, object value); void AddOrReplaceKey(string key, object value = null); void RemoveKey(string key);

Kirides.Libs.Extensions.IQueryable.Search.IQueryableSearchExtensions

Allows for Full-Text-Search of a given Type or Property/Field. It uses Expression-Trees and is compatible (in that it does the computation on the Db-side) with (few tested) ORM's (MongoDb.Driver, EntityFramework, ...)

//DEMO IQueryable<File> files = ...; IQueryable<File> filesWithTest = files.FullTextSearch<File>(x => Name, "Test", exactMatch: false, matchAllWords: true); /*  File:  {  Name: "Production App Test.exe"  },  {  Name: "Production App Test.exe"  } */ IQueryable<Log> logs = ...; IQueryable<Log> logsWithError_404 = files.FullTextSearch<Log>("Error 404", exactMatch: false, matchAllWords: true); /*  Log:  { // Found because either "ShortDescription" or "Content" contained "Error" and "404"  ShortDescription: "Error code 404",  Content: "Website responded with Error code 404"  },  {  ShortDescription: "Error code 404", // Found because "ShortDescription" contained "Error" and "404"  Content: "Page could not be found"  } */

Kirides.Libs.Extensions.IQueryable.Sorting.SortExtensions

Allows for dynamic (string based) sorting of IQueryable<TSource>.
Supports nested properties. (No IEnumerable<T>-like properties)

IQueryable<User> users = ...; IOrderedQueryable<Users> usersById = users.SortBy("Name"); IOrderedQueryable<Users> usersByIdThenDateDay = usersById.ThenSortBy("Date.Day"); List<User> orderedUsers = usersByIdThenDateDay.ToList(); class User { public string Name { get; set; } public DateTime Date { get; set; } }

Kirides.Libs.Extensions.IO.ByteSizeExtensions

Humanizing of bytesizes for common datatypes used for sizes. (double, float, long, int)

double fileSize = 1024; string humanFileSize = fileSize.Humanize(); // "1 KiB" string humanFileSizeSi = fileSize.Humanize(si: true); // "1,02 kB"

Releases

No releases published

Packages

No packages published

Languages