ConfigurationHelper-Class
using NLog; using System; using System.Collections.Generic; using System.IO; using System.Threading; namespace Common.Libraries { /// <summary> /// Handels Local File Configuration /// </summary> public sealed class ConfigurationHelper { private string _configurationPath = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + @"\Reflection\"; private string _configurationFile = "reflection.config"; private static readonly Logger _log = LogManager.GetCurrentClassLogger(); private static readonly object _locker = new object(); public Dictionary<string, object> ConfigurationItems { get; private set; } private static ConfigurationHelper _configuration = new ConfigurationHelper(); public static ConfigurationHelper Configuration { get { return _configuration; } private set { lock(_locker) { _configuration = value; Monitor.Pulse(_locker); } } } private ConfigurationHelper() { } static ConfigurationHelper() { } /// <summary> /// Loads the Confiugration if it exists, Creates a Standard-Configuration with default Values /// if it does not exist /// </summary> public void LoadOrCreateConfiguration() { _log.Debug("--> LoadOrCreateConfiguration"); if (!ConfigurationSet) { ConfigurationItems = new Dictionary<string, object>(); PropertiesToDictionary(); _log.Trace("### Dictonary with the configuration items has been created"); if (ConfigurationExists()) { ReadConfiguration(); _log.Debug("<-- LoadOrCreateConfiguration"); } else { CreateConfiguration(); _log.Debug("<-- LoadOrCreateConfiguration"); } } } /// <summary> /// Save a current Configuration /// </summary> public void SaveConfiuration() { _log.Debug("--> SaveConfiguration"); CreateConfiguration(); _log.Debug("<-- Save Configuration"); } /// <summary> /// Create the Standard configuration with the property values /// </summary> private void CreateConfiguration() { _log.Debug("--> CreateStandardConfiguration"); if (!ConfigurationSet) SetDefautlValues(); if (!ConfigurationExists()) Directory.CreateDirectory(_configurationPath); using (FileStream fs = new FileStream(_configurationPath + _configurationFile, FileMode.OpenOrCreate, FileAccess.Write)) { using (StreamWriter sw = new StreamWriter(fs)) { foreach (KeyValuePair<string, object> configItem in ConfigurationItems) { sw.WriteLine(configItem.Key + "=" + configItem.Value); } } } _log.Debug("<-- CreateStandardConfiguration: Created standard configuration and file: {0}", _configurationPath + _configurationFile); } /// <summary> /// Set Default Values for the Configuration /// </summary> private void SetDefautlValues() { _log.Debug("--> SetDefaultValues"); LocalIPAddress = "10.254.0.101"; LocalPort = "0"; RemoteIPAddress = "10.254.0.133"; RemotePort = "43238"; TCP = false; UDP = false; Multicast = true; GzipCompression = false; ReceiveBufferSize = "8192"; MaxSegmentSize = "200"; SocketBufferSize = "8388608"; MulticastSendTimeoutInMS = "500"; DateMatchGroup = @"(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})"; TextAfterDateMatch = @"(.*)"; TextBeforeProviderMatchGroup = @"CallList from"; ProviderMatchGroup = @"(.*)"; TextBeforeXMLCallListMatchGroup = @"\/MTP received. New Revision \(\d{1,9}\):"; CallListMatchGroup = @"(.*)"; FullRegex = DateMatchGroup + TextAfterDateMatch + TextBeforeProviderMatchGroup + ProviderMatchGroup + TextBeforeXMLCallListMatchGroup + CallListMatchGroup; ExtractionFolder = @"C:\Temp\"; ExtractionFileName = @"extraction.log"; ConfigurationSet = true; PropertiesToDictionary(); _log.Debug("<-- SetDefaultValues"); } /// <summary> /// Read Configuration from Configuration File /// </summary> private void ReadConfiguration() { _log.Debug("--> ReadConfiguration"); using (FileStream fileStream = new FileStream(_configurationPath + _configurationFile, FileMode.Open, FileAccess.Read)) { using (StreamReader streamreader = new StreamReader(fileStream)) { string configurationLine; while (!streamreader.EndOfStream) { configurationLine = streamreader.ReadLine(); configurationLine = configurationLine.Trim(); string[] configItem = configurationLine.Split('='); UpdateDictionaryValue(configItem); } } } ConfigurationSet = true; ConfigurationItems[nameof(ConfigurationSet)] = true; DictionaryToProperties(); _log.Debug("<-- ReadConfiguration"); } /// <summary> /// Transfers the read configuration Item to the Property, so it can be accessed from outside /// </summary> /// <param name="configItem">String Array with Propertyname and Propertyvalue</param> private void UpdateDictionaryValue(string[] configItem) { _log.Debug("--> TransformConfigurationItemToPropertyViaReflection: Configuration Item: {0}, Configuration Value: {1}", configItem[0], configItem[1]); if (ConfigurationItems.ContainsKey(configItem[0])) ConfigurationItems[configItem[0]] = configItem[1]; else _log.Error("### Configuration Item with Key: {0} and Value: {1} couldn't be found", configItem[0], configItem[1]); _log.Trace("<-- TransformConfigurationItemToPropertyViaReflection"); } /// <summary> /// Uses Reflection to get a dictionary of the properties /// </summary> private void PropertiesToDictionary() { _log.Debug("--> GenerateDictionaryFromProperties"); ConfigurationItems = (Dictionary<string, object>)ObjectExtensions.ObjectToDictionary(this); _log.Debug("### Properties found {0}", ConfigurationItems.Count); _log.Debug("<-- GenerateDictionaryFromProperties"); } /// <summary> /// Transforms the Dictionary to the Singleton Properties /// </summary> private void DictionaryToProperties() { _log.Debug("--> DictionaryToProperties"); Configuration = ObjectExtensions.ObjectFromDictionary<ConfigurationHelper>(ConfigurationItems); _log.Debug("<-- DictionaryToProperties"); } /// <summary> /// Check if the Confiuration File exists /// </summary> /// <returns></returns> private bool ConfigurationExists() { _log.Debug("<--> ConfigurationExists"); return File.Exists(_configurationPath + _configurationFile); } #region Properties public bool ConfigurationSet { get; set; } public string RemoteIPAddress { get; set; } public string RemotePort { get; set; } public string LocalIPAddress { get; set; } public string LocalPort { get; set; } public bool TCP { get; set; } public bool UDP { get; set; } public bool Multicast { get; set; } public bool GzipCompression { get; set; } public string ReceiveBufferSize { get; set; } public string MaxSegmentSize { get; set; } public string SocketBufferSize { get; set; } public string DateMatchGroup { get; set; } public string TextAfterDateMatch { get; set; } public string TextBeforeProviderMatchGroup { get; set; } public string ProviderMatchGroup { get; set; } public string TextBeforeXMLCallListMatchGroup { get; set; } public string FullRegex { get; private set; } public string CallListMatchGroup { get; set; } public string ConfigurationPath { get { return _configurationPath; } private set => _configurationPath = value; } public string ConfigurationFile { get { return _configurationFile; } private set => _configurationFile = value; } public string ExtractionFileName { get; set; } public string ExtractionFolder { get; set; } public string MulticastSendTimeoutInMS { get; set; } #endregion properties } }
ObjectExtensions Class
using NLog; using System; using System.Collections.Generic; using System.Reflection; namespace Common.Libraries { public static class ObjectExtensions { private static readonly Logger _log = LogManager.GetCurrentClassLogger(); /// <summary> /// Transfer a given dicionary to a given class /// </summary> /// <typeparam name="T">Class with Properties to be mapped</typeparam> /// <param name="dict">Dictionary for Property-mapping</param> /// <returns></returns> public static T ObjectFromDictionary<T>(IDictionary<string, object> dict) where T:class { _log.Debug("--> ObjectFromDictionary"); Type myObjectType = typeof(T); T result = (T)Activator.CreateInstance(myObjectType); foreach (var item in dict) { //TODO optimize this if! if (item.Value.Equals("true") || item.Value.Equals("True")) myObjectType.GetProperty(item.Key).SetValue(result, true, null); else if(item.Value.Equals("false") || item.Value.Equals("False")) myObjectType.GetProperty(item.Key).SetValue(result, false, null); else myObjectType.GetProperty(item.Key).SetValue(result, item.Value, null); } _log.Debug("<-- ObjectFromDictionary"); return result; } /// <summary> /// Transfers a given class and the properties to a Dictionary /// </summary> /// <typeparam name="T">Classtype to be transfered</typeparam> /// <param name="item">Class-Object to be transfered</param> /// <returns></returns> public static IDictionary<string, object> ObjectToDictionary<T>(T item) where T:class { Type myObjectType = item.GetType(); IDictionary<string, object> dict = new Dictionary<string, object>(); PropertyInfo[] properties = myObjectType.GetProperties(); foreach (PropertyInfo property in properties) { var value = property.GetValue(item, null); dict.Add(property.Name, value); } return dict; } } }
If you have any Suggestions or find a better soluation, just write a comment 🙂