/// <summary> /// Compares 2 therms in assuming they are in the given type /// </summary> /// <param name="therms">(type:th1:th2)</param> /// <returns>Equals, 1 is false and 0 is true; Compare \< is 1, \> is 2, 0 is = </returns> private int Compare(string therms) { var elemtents = therms.Replace("(", "").Replace(")", "").Split('|'); var cmp_type = elemtents.ElementAtOrDefault(0); //Type var first = elemtents.ElementAtOrDefault(1); //First var second = elemtents.ElementAtOrDefault(2); //Second first = Getter(first); second = Getter(second); var type = Type.GetType(cmp_type) ?? TypeAliasContainer.GetFromAlias(cmp_type); var variable = GetVariableOfType(type); if ((variable is IComparable) && (variable is IConvertible)) { var new_f = Convert.ChangeType(first, type); var new_s = Convert.ChangeType(second, type); var compared = ((dynamic)new_f).CompareTo(new_s); return(compared == 0 ? 0 : compared == -1?1:compared == 1?2:-1); } else if (variable is IConvertible) { var new_f = Convert.ChangeType(first, type); var new_s = Convert.ChangeType(second, type); return(new_f.Equals(new_s) ? 0 : 1); } else { return(((object)first).Equals((object)second) ? 0 : 1); } }
private void HandleToRam(string generator) { var dst1 = generator.Split(':'); var name = dst1.ElementAtOrDefault(0); //Name var value = dst1.ElementAtOrDefault(1); //Value var type = dst1.ElementAtOrDefault(2); //Type //Remove if exsists the variable from ram if (Ram.Any((s) => s.Name == name)) { Ram.Remove(Ram.First((s) => s.Name == name)); } //The variable is not in ram and has to be created var actual_type = Type.GetType(type) ?? TypeAliasContainer.GetFromAlias(type); if (actual_type == null) { throw new InvalidVariableTypeException(string.Format("The type {0} is not a valid .Net or SelfLanguage type", type)); } var convert = Conversion.GetConversion(actual_type); var obj = GetVariableOfType(actual_type); if (convert.Any(s => s == PossibleConversion.IStringable)) { dynamic o = obj; Ram.Add(new Variable(o.FromString(value), name)); } else if (convert.Any(s => s == PossibleConversion.IConvertible)) { var o = Convert.ChangeType(value, obj.GetType()); Ram.Add(new Variable(o, name)); } else if (convert.Any(s => s == PossibleConversion.Constructor)) { var o = obj.GetType().GetConstructors().First((s) => s.GetParameters().Length == 1 && s.GetParameters().First().GetType() == typeof(string)); Ram.Add(new Variable(o, name)); } else if (convert.Any(s => s == PossibleConversion.FromStringImplicit)) //is the type implicitally convertible from string { obj = value; Ram.Add(new Variable(obj, name)); } else if (convert.Any(s => s == PossibleConversion.FromStringExplicit)) { obj = value; //TODO } else if (obj.GetType() is object) { obj = value; Ram.Add(new Variable(obj, name)); } else { throw new InvalidVariableTypeException("The type {0} is not castable or convertible from string, and it does not have a constructor using one string argument"); } }