/// <summary> /// Construtor padrão. /// </summary> /// <param name="expressao"></param> /// <param name="variavies"></param> public ExpressaoAccessor(Expressao expressao, IVariavelCollection variavies) { expressao.Require(nameof(expressao)).NotNull(); variavies.Require(nameof(variavies)).NotNull(); Expressao = expressao; _variaveis = variavies; }
/// <summary> /// Executa o calculo do valor da expressão. /// </summary> /// <param name="variaveis">Variáveis que serão usadas no cálculo da expressão.</param> /// <returns></returns> private double Calcular(IVariavelCollection variaveis) { variaveis.Require(nameof(variaveis)).NotNull(); if (ExpressaoCompilada != null) { try { var accessor = new Accessors.ExpressaoAccessor(this, variaveis); var values = new object[] { accessor } .Concat( _lambdaExpression .Parameters .Skip(1) // Recupera somente os valores das variáveis de dependencia .Select(f => _variaveisDependencia.Contains(f.Name) ? variaveis[f.Name] : 0.0) .OfType <object>()) .ToArray(); return((double)ExpressaoCompilada.DynamicInvoke(values)); } catch (Exception ex) { throw new InvalidOperationException("Um erro ocorreu ao tentar compilar a expressão.", ex); } } return(0.0); }
/// <summary> /// Cria uma cópia da formula usando as variáveis informadas. /// </summary> /// <param name="formula"></param> /// <returns></returns> public Formula CreateCopy(IVariavelCollection variaveis) { var formula = new Formula(Nome, variaveis); var expressao = _expressao.CreateCopy(formula); formula._expressao = expressao; return(formula); }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="variaveis"></param> public VariavelCollectionValueAccessor(IVariavelCollection variaveis) { _variaveis = variaveis; }
/// <summary> /// Adiciona uma coleção de variáveis. /// </summary> /// <param name="variableCollection"></param> public void AdicionarVariaveis(IVariavelCollection variableCollection) { variableCollection.Require(nameof(variableCollection)).NotNull(); _agregadorVariaveis.Add(variableCollection); }
/// <summary> /// Remove a coleção do gregador. /// </summary> /// <param name="collection"></param> /// <returns></returns> public bool Remove(IVariavelCollection collection) { return(_collections.Remove(collection)); }
/// <summary> /// Adiciona uma coleção para o agregador. /// </summary> /// <param name="collection"></param> public void Add(IVariavelCollection collection) { _collections.Add(collection); }