Fill a dictionary with properties of a class

There are 7 private functions

Function: ConfigurationExists()

The ConfigurationExists function, just checks if the file exists or not

/// <summary>
/// Check if the Confiuration File exists
/// </summary>
/// <returns></returns>
private bool ConfigurationExists()
{
	_log.Debug("<--> ConfigurationExists");

	return File.Exists(_configurationPath + _configurationFile);
}

Function: CreateConfiguration()

Within the Function it is first checked if the Configuration has been set, if not the Function “SetDefaultValues()” creates a set of standard values for the properties. Next we check if the Configuration exists, this is done because saving the normal configuration and creating a standard configuration is done through the same function.

We iterate through the dictionary and write all the key-value Items into the configuration file.

/// <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);
}

Function: SetDefaultValues()

This function just creates a set of default values, if no file has been found.

/// <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");
}

Function: ReadConfiguration()

The ReadConfiguration function opens a Filestream to the configuration file and reads all key-value pairs, line by line, every line is split and given to the “UpdateDictionaryValue”-Function.

After all Dictionary Entries are updated, the Dictionary is transfered to the Singleton object, so it can be accessed by other parts of the program.

/// <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();

				//=== Equals a Topic and can be ignored
				if (!configurationLine.Contains("==="))
				{
					string[] configItem = configurationLine.Split('=');
					UpdateDictionaryValue(configItem);
				}
			}
		}
	}
	ConfigurationSet = true;
	ConfigurationItems[nameof(ConfigurationSet)] = true;

	DictionaryToProperties();

	_log.Debug("<-- ReadConfiguration");
}

Function: UpdateDictionaryValue(configItem)

The Function checks if an configuration item is within the dictionary and if it finds it, updates the value for this particular item.

/// <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");
}

Now to the last 2 private functions were all the magic happens, actually the refer to a new class, but we go there in just a minute.

Funcion: PropertiesToDictionary()

This function takes itself (this) and gets a Dictionary via a static class and reflections with all the properties as key-value pairs

/// <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");
}

Function: DictionaryToProperties()

This function transfers all the Key-Value Pairs of the dictionary to the singleton for external excess.

/// <summary>
/// Transforms the Dictionary to the Singleton Properties
/// </summary>
private void DictionaryToProperties()
{
	_log.Debug("--> DictionaryToProperties");

	Configuration = ObjectExtensions.ObjectFromDictionary<ConfigurationHelper>(ConfigurationItems);

	_log.Debug("<-- DictionaryToProperties");
}
This entry was posted in C#, PC, programming, Sonstiges, Wissen, Work and tagged , , , , . Bookmark the permalink.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.