Collection of small - single-".cs" libraries.
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
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 theIIniConfig.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);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" } */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; } }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"