public override Expression Build(IEnumerable <Expression> arguments) { var source = arguments.First(); var parameterType = source.Type.GetGenericArguments()[0]; var valueParameter = Expression.Parameter(typeof(object)); var viewParameter = Expression.Parameter(typeof(RollingGraphVisualizer)); var elementVariable = Expression.Variable(parameterType); Controller = new VisualizerController(); Controller.Capacity = Capacity.GetValueOrDefault(); var selectedIndex = GraphHelper.SelectIndexMember(elementVariable, IndexSelector, out Controller.IndexLabel); Controller.IndexType = selectedIndex.Type; if (selectedIndex.Type != typeof(double) && selectedIndex.Type != typeof(string)) { selectedIndex = Expression.Convert(selectedIndex, typeof(double)); } var selectedValues = GraphHelper.SelectDataValues(elementVariable, ValueSelector, out Controller.ValueLabels); var showBody = Expression.Block(new[] { elementVariable }, Expression.Assign(elementVariable, Expression.Convert(valueParameter, parameterType)), Expression.Call(viewParameter, nameof(RollingGraphVisualizer.AddValues), null, selectedIndex, selectedValues)); Controller.AddValues = Expression.Lambda <Action <object, RollingGraphVisualizer> >(showBody, valueParameter, viewParameter).Compile(); return(Expression.Call(typeof(RollingGraphBuilder), nameof(Process), new[] { parameterType }, source)); }
public override Expression Build(IEnumerable <Expression> arguments) { var source = arguments.First(); var parameterType = source.Type.GetGenericArguments()[0]; var valueParameter = Expression.Parameter(typeof(object)); var viewParameter = Expression.Parameter(typeof(LineGraphVisualizer)); var elementVariable = Expression.Variable(parameterType); Controller = new VisualizerController(); Controller.Capacity = Capacity.GetValueOrDefault(); Controller.SymbolType = SymbolType; Controller.LineWidth = LineWidth; var selectedValues = GraphHelper.SelectDataPoints(elementVariable, ValueSelector, out Controller.ValueLabels); var addValuesBody = Expression.Block(new[] { elementVariable }, Expression.Assign(elementVariable, Expression.Convert(valueParameter, parameterType)), Expression.Call(viewParameter, nameof(LineGraphVisualizer.AddValues), null, selectedValues)); Controller.AddValues = Expression.Lambda <Action <object, LineGraphVisualizer> >(addValuesBody, valueParameter, viewParameter).Compile(); return(Expression.Call(typeof(LineGraphBuilder), nameof(Process), new[] { parameterType }, source)); }