/// <summary> /// Convierte un objeto en una variable (o lo deja tal cual si ya era una variable) /// </summary> private VariableModel ConvertToVariable(object value) { if (value is VariableModel implicitVariable) { return(implicitVariable); } else { VariableModel variable = new VariableModel(Guid.NewGuid().ToString(), GetVariableType(value)); // Asigna el valor variable.Value = value; // y convierte el resultado return(variable); } }
/// <summary> /// Convierte un objeto a fecha /// </summary> private DateTime?ConvertToDate(VariableModel variable) { string value = ConvertToString(variable); // Interpreta la fecha como una cadena de tipo yyyy-MM-dd HH:mm:ss if (!string.IsNullOrWhiteSpace(value) && DateTime.TryParseExact(value, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat, System.Globalization.DateTimeStyles.AssumeUniversal, out DateTime result)) { return(result); } else { return(null); } }
/// <summary> /// Añade una variable /// </summary> public void Add(string name, VariableModel.VariableType type, object value) { // Normaliza el nombre name = Normalize(name); // Añade / modifica el valor if (Variables.ContainsKey(name)) { Variables[name].Value = value; } else { VariableModel variable = new VariableModel(name, type); // Asigna el valor variable.Value = value; // Añade la variable a la tabla Variables.Add(name, variable); } }
/// <summary> /// Compara el valor de la variable con un valor /// </summary> public CompareResult Compare(object value) { VariableModel target = ConvertToVariable(value); if (target == null && Value == null) { return(CompareResult.Equals); } else if (target != null && Value == null) { return(CompareResult.LessThan); } else if (target == null && Value != null) { return(CompareResult.GreaterThan); } else { switch (Type) { case VariableType.Numeric: return(CompareWithNumeric(ConvertToNumeric(target))); case VariableType.Date: return(CompareWithDate(ConvertToDate(target))); case VariableType.Boolean: return(CompareWithBoolean(ConvertToBoolean(target))); case VariableType.String: return(CompareWithString(ConvertToString(target))); default: throw new NotImplementedException($"Cant compare variable {Name} with type {Type} and the value {target}"); } } }
/// <summary> /// Convierte un objeto a un tipo determinado /// </summary> private string ConvertToString(VariableModel variable) { switch (variable.Value) { case DateTime date: return($"{date:yyyy-MM-dd HH:mm:ss}"); case double number: return(number.ToString(System.Globalization.CultureInfo.InvariantCulture)); case decimal number: return(number.ToString(System.Globalization.CultureInfo.InvariantCulture)); case int number: return(number.ToString(System.Globalization.CultureInfo.InvariantCulture)); case float number: return(number.ToString(System.Globalization.CultureInfo.InvariantCulture)); case bool boolean: if (boolean) { return("true"); } else { return("false"); } case string value: return(value); default: return(variable.Value.ToString()); } }
/// <summary> /// Convierte un objeto a boolean /// </summary> private bool ConvertToBoolean(VariableModel variable) { return(Convert.ToBoolean(variable.Value)); }
/// <summary> /// Convierte un objeto a numérico /// </summary> private double ConvertToNumeric(VariableModel variable) { return(Convert.ToDouble(variable.Value)); }
/// <summary> /// Añade una variable /// </summary> public void Add(VariableModel variable) { Add(variable.Name, variable.Type, variable.Value); }