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