protected static Expression GetConversion( Expression sourceValue, Type targetType, MethodInfo tryParseMethod, ParameterExpression valueVariable) { if (sourceValue.Type != typeof(string)) { sourceValue = ToStringConverter.GetConversion(sourceValue); } var tryParseCall = Expression.Call(tryParseMethod, sourceValue, valueVariable); var successfulParseReturnValue = valueVariable.GetConversionTo(targetType); var defaultValue = targetType.ToDefaultExpression(); var parsedValueOrDefault = Expression.Condition(tryParseCall, successfulParseReturnValue, defaultValue); var tryParseBlock = Expression.Block(new[] { valueVariable }, parsedValueOrDefault); return(tryParseBlock); }
public override Expression GetConversion(Expression sourceValue, Type targetType) { if (sourceValue.Type == _nullableTargetType) { return(sourceValue.GetValueOrDefaultCall()); } if (sourceValue.Type != typeof(string)) { sourceValue = _toStringConverter.GetConversion(sourceValue); } var tryParseCall = Expression.Call(_tryParseMethod, sourceValue, _valueVariable); var successfulParseReturnValue = _valueVariable.GetConversionTo(targetType); var defaultValue = Expression.Default(targetType); var parsedValueOrDefault = Expression.Condition(tryParseCall, successfulParseReturnValue, defaultValue); var tryParseBlock = Expression.Block(new[] { _valueVariable }, parsedValueOrDefault); return(tryParseBlock); }
private static Expression GetNumericToFlagsEnumConversion( Expression sourceValue, Expression fallbackValue, Type nonNullableTargetEnumType, string enumTypeName, ParameterExpression enumValueVariable, Expression assignEnumValue) { var underlyingEnumType = enumValueVariable.Type; var sourceValueVariable = Expression.Variable(underlyingEnumType, enumTypeName + "Source"); if (sourceValue.Type != underlyingEnumType) { sourceValue = Expression.Convert(sourceValue, underlyingEnumType); } var assignSourceVariable = sourceValueVariable.AssignTo(sourceValue); var populationLoop = GetNumericToFlagsEnumPopulationLoop( nonNullableTargetEnumType, enumTypeName, enumValueVariable, sourceValueVariable, out var enumValuesVariable, out var assignEnumValues); var populationBlock = Expression.Block( new[] { sourceValueVariable, enumValueVariable, enumValuesVariable }, assignSourceVariable, assignEnumValue, assignEnumValues, populationLoop, enumValueVariable.GetConversionTo(fallbackValue.Type)); return(populationBlock); }