/// <summary> /// Converts the specified value. /// </summary> /// <param name="value"> /// The value to convert. /// </param> /// <param name="valueType"> /// The unified value type. /// </param> /// <param name="converter"> /// The converter to use for conversion. /// </param> /// <typeparam name="T"> /// The type to convert to. /// </typeparam> /// <returns> /// The converted value as the specified type. /// </returns> /// <exception cref="BusinessException"> /// The value could not be converted. The inner exception provides additional details. /// </exception> private static T ConvertValue <T>(object value, UnifiedValueType valueType, Func <object, T> converter) { T convertedValue; try { convertedValue = converter(value); } catch (FormatException ex) { var failureMessage = $"Value '{value}' cannot be converted to type '{valueType}'."; throw new BusinessException(value, failureMessage, ex); } catch (OverflowException ex) { var failureMessage = $"Value '{value}' cannot be converted to type '{valueType}'."; throw new BusinessException(value, failureMessage, ex); } catch (InvalidCastException ex) { var failureMessage = $"Value '{value}' cannot be converted to type '{valueType}'."; throw new BusinessException(value, failureMessage, ex); } return(convertedValue); }
/// <summary> /// Initializes a new instance of the <see cref="UnifiedField"/> class. /// </summary> /// <param name="name"> /// The name. /// </param> /// <param name="unifiedFieldType"> /// The unified field type. /// </param> /// <param name="unifiedValueType"> /// The unified value type. /// </param> /// <param name="unifiedFieldId"> /// The unified field ID. /// </param> /// <param name="customFieldId"> /// The custom field ID. /// </param> /// <param name="systemFieldId"> /// The system field ID. /// </param> public UnifiedField( string name, UnifiedFieldType unifiedFieldType, UnifiedValueType unifiedValueType, int?unifiedFieldId = null, int?customFieldId = null, int?systemFieldId = null) { this.Name = name; this.UnifiedFieldType = unifiedFieldType; this.UnifiedValueType = unifiedValueType; this.UnifiedFieldId = unifiedFieldId; this.CustomFieldId = customFieldId; this.SystemFieldSourceId = systemFieldId; }
/// <summary> /// Loads user sourced values into the specified filtered values list. /// </summary> /// <param name="values"> /// The values to load. /// </param> /// <param name="valueType"> /// The value type to load. /// </param> /// <param name="filteredValues"> /// The filtered values list. /// </param> /// <exception cref="BusinessException"> /// <paramref name="valueType"/> is unknown. /// </exception> /// <exception cref="ArgumentOutOfRangeException"> /// The enumeration value of <paramref name="valueType"/> is not one of the named values. /// </exception> private void LoadUserSourcedValues(IEnumerable <object> values, UnifiedValueType valueType, List <object> filteredValues) { switch (valueType) { case UnifiedValueType.Unknown: throw new BusinessException(this.UnifiedField, "Unknown field type can't have value set."); case UnifiedValueType.Integer: filteredValues.AddRange(values.Select(value => ConvertValue(value, valueType, Convert.ToInt64)).Cast <object>()); break; case UnifiedValueType.Decimal: case UnifiedValueType.Currency: filteredValues.AddRange(values.Select(value => ConvertValue(value, valueType, Convert.ToDouble)).Cast <object>()); break; case UnifiedValueType.Date: foreach (var value in values) { // Here we use the implicit nullable cast to catch both nullable and value date types. var dateTimeOffset = value as DateTimeOffset?; if (dateTimeOffset != null) { filteredValues.Add(value); continue; } var dateTime = value as DateTime?; if (dateTime != null) { filteredValues.Add(new DateTimeOffset(dateTime.GetValueOrDefault())); continue; } var dateTimeString = Convert.ToString(value); DateTimeOffset dateTimeOffsetValue; if (DateTimeOffset.TryParse(dateTimeString, out dateTimeOffsetValue)) { filteredValues.Add(dateTimeOffsetValue); continue; } var message = $"Value '{value}' cannot be converted to type '{valueType}'."; throw new BusinessException(value, message); } break; case UnifiedValueType.Text: filteredValues.AddRange(values.Select(Convert.ToString)); break; case UnifiedValueType.Attachment: foreach (var value in values) { var documentVersion = value as DocumentVersion; if (documentVersion == null) { var message = $"Value '{value}' cannot be converted to type '{valueType}'."; throw new BusinessException(value, message); } filteredValues.Add(value); } break; default: throw new ArgumentOutOfRangeException(nameof(valueType)); } }