private object Convert(object value)
        {
            foreach (ObjectLookupItemBase LookupItem in this.LookupItems)
            {
                if (LookupItem is ObjectLookupOtherwiseItem)
                {
                    return(LookupItem.Value);
                }
                else if (LookupItem is ObjectLookupItem)
                {
                    ObjectLookupItem Item = (ObjectLookupItem)LookupItem;

                    Type KeyType   = Item.Key?.GetType();
                    Type ValueType = value?.GetType();

                    if (KeyType == ValueType)
                    {
                        if (object.Equals(Item.Key, value))
                        {
                            return(LookupItem.Value);
                        }
                    }
                    else if (KeyType != null && ValueType != null)
                    {
                        TypeConverter KeyConverter   = TypeDescriptor.GetConverter(Item.Key);
                        TypeConverter ValueConverter = TypeDescriptor.GetConverter(value);
                        if (KeyConverter.CanConvertTo(ValueType))
                        {
                            object ConvertedKey = KeyConverter.ConvertTo(Item.Key, ValueType);
                            if (object.Equals(ConvertedKey, value))
                            {
                                return(LookupItem.Value);
                            }
                        }
                        else if (KeyConverter.CanConvertFrom(ValueType))
                        {
                            object ConvertedValue = KeyConverter.ConvertFrom(value);
                            if (object.Equals(Item.Key, ConvertedValue))
                            {
                                return(LookupItem.Value);
                            }
                        }
                        else if (ValueConverter.CanConvertTo(KeyType))
                        {
                            object ConvertedValue = KeyConverter.ConvertTo(value, KeyType);
                            if (object.Equals(Item.Key, ConvertedValue))
                            {
                                return(LookupItem.Value);
                            }
                        }
                        else if (ValueConverter.CanConvertFrom(ValueType))
                        {
                            object ConvertedKey = KeyConverter.ConvertFrom(Item.Key);
                            if (object.Equals(ConvertedKey, value))
                            {
                                return(LookupItem.Value);
                            }
                        }
                        else
                        {
                            // Value could not be converted to be compared.
                            // this also may be, because one value has a type and the other one is null.
                            // -> Handle as 'not found'
                        }
                    }
                }
                else
                {
                    throw new InvalidOperationException("Unknown lookup item type");
                }
            }

            //Not found - Fallback: return unconverted value
            return(value);
        }
        private object ConvertBack(object value)
        {
            foreach (ObjectLookupItemBase LookupItem in this.LookupItems)
            {
                if (LookupItem is ObjectLookupOtherwiseItem)
                {
                    DebugLogger.WriteLine(this, LoggingLevel.Normal, () => string.Format("WARNING: ObjectLookupConverter could convert back '{1}' as it is the 'otherwise' item: '{0}'", value, this.Name));
                    return(null);
                }
                else if (LookupItem is ObjectLookupItem)
                {
                    ObjectLookupItem Item = (ObjectLookupItem)LookupItem;

                    Type DestinationType = Item.Value?.GetType();
                    Type ValueType       = value?.GetType();

                    if (DestinationType == ValueType)
                    {
                        if (object.Equals(Item.Value, value))
                        {
                            return(Item.Key);
                        }
                    }
                    else if (DestinationType != null && ValueType != null)
                    {
                        TypeConverter Converter      = TypeDescriptor.GetConverter(Item.Value);
                        TypeConverter ValueConverter = TypeDescriptor.GetConverter(value);
                        if (Converter.CanConvertTo(ValueType))
                        {
                            object ConvertedValue = Converter.ConvertTo(Item.Value, ValueType);
                            if (object.Equals(ConvertedValue, value))
                            {
                                return(Item.Key);
                            }
                        }
                        else if (Converter.CanConvertFrom(ValueType))
                        {
                            object ConvertedValue = Converter.ConvertFrom(value);
                            if (object.Equals(Item.Value, ConvertedValue))
                            {
                                return(Item.Key);
                            }
                        }
                        else if (ValueConverter.CanConvertTo(DestinationType))
                        {
                            object ConvertedValue = Converter.ConvertTo(value, DestinationType);
                            if (object.Equals(Item.Value, ConvertedValue))
                            {
                                return(Item.Key);
                            }
                        }
                        else if (ValueConverter.CanConvertFrom(ValueType))
                        {
                            object ConvertedValue = Converter.ConvertFrom(Item.Value);
                            if (object.Equals(ConvertedValue, value))
                            {
                                return(Item.Key);
                            }
                        }
                        else
                        {
                            // Value could not be converted to be compared.
                            // this also may be, because one value has a type and the other one is null.
                            // -> Handle as 'not found'
                        }
                    }
                }
                else
                {
                    throw new InvalidOperationException("Unknown lookup item type");
                }
            }

            //Not found - Fallback: return unconverted value
            return(value);
        }