public static Func <DateTime, DateTime, double> generateLimitRange(e_limDirection direction) { ParameterExpression pMin = Expression.Parameter(typeof(DateTime)); ParameterExpression pMax = Expression.Parameter(typeof(DateTime)); ParameterExpression pDouble = Expression.Parameter(typeof(double)); Func <DateTime, DateTime, double> fncRange = (min, max) => { double result = max.Subtract(min).Days; return((result < 0) ? 0 : result); }; Expression <Func <DateTime, DateTime, double> > lmbRange = (min, max) => fncRange(min, max); BlockExpression block = Expression.Block(typeof(double), cDNull); switch (direction) { case e_limDirection.Fixed: block = Expression.Block( typeof(double), new[] { pDouble }, Expression.Assign(pDouble, cDNull), pDouble ); break; case e_limDirection.Right: case e_limDirection.Left: block = Expression.Block( typeof(double), new[] { pDouble }, Expression.Assign(pDouble, cDUnlim), pDouble ); break; case e_limDirection.Range: block = Expression.Block( typeof(double), new[] { pDouble }, Expression.Assign(pDouble, Expression.Invoke(lmbRange, pMin, pMax)), pDouble ); break; } return(Expression.Lambda <Func <DateTime, DateTime, double> >(block, pMin, pMax).Compile()); }
public static Func <DateTime, DateTime> generateStatic (e_limDirection direction, DateTime minLimit, DateTime maxLimit) { BlockExpression block; ConstantExpression pMin = Expression.Constant(minLimit); ConstantExpression pMax = Expression.Constant(maxLimit); ParameterExpression pDate = Expression.Parameter(typeof(DateTime)); ParameterExpression pResult = Expression.Parameter(typeof(DateTime)); ParameterExpression pTemp = Expression.Parameter(typeof(DateTime)); switch (direction) { case e_limDirection.Fixed: block = Expression.Block( Expression.Assign(pResult, pMin) ); break; case e_limDirection.Left: block = Expression.Block( Expression.IfThenElse( Expression.LessThanOrEqual(pDate, pMax), Expression.Assign(pResult, pDate), Expression.Assign(pResult, pMax)) ); break; case e_limDirection.Right: block = Expression.Block( Expression.IfThenElse( Expression.GreaterThanOrEqual(pDate, pMin), Expression.Assign(pResult, pDate), Expression.Assign(pResult, pMin)) ); break; case e_limDirection.Range: block = Expression.Block( Expression.IfThenElse( Expression.LessThanOrEqual(pDate, pMax), Expression.Assign(pTemp, pDate), Expression.Assign(pTemp, pMax)), Expression.IfThenElse( Expression.GreaterThanOrEqual(pDate, pMin), Expression.Assign(pResult, pTemp), Expression.Assign(pResult, pMin)) ); break; default: throw new Exception("Неверное значение параметра e_limDirection метода generateDynamicDir"); } BlockExpression resBlock = Expression.Block( typeof(DateTime), new[] { pResult, pTemp }, block, pResult ); return(Expression.Lambda <Func <DateTime, DateTime> >(resBlock, pDate).Compile()); }
public void setDirection(e_limDirection direction) { this.direction = direction; }
public static Func<DateTime, DateTime> generateStatic(e_limDirection direction, DateTime minLimit, DateTime maxLimit) { BlockExpression block; ConstantExpression pMin = Expression.Constant(minLimit); ConstantExpression pMax = Expression.Constant(maxLimit); ParameterExpression pDate = Expression.Parameter(typeof(DateTime)); ParameterExpression pResult = Expression.Parameter(typeof(DateTime)); ParameterExpression pTemp = Expression.Parameter(typeof(DateTime)); switch (direction) { case e_limDirection.Fixed: block = Expression.Block( Expression.Assign(pResult, pMin) ); break; case e_limDirection.Left: block = Expression.Block( Expression.IfThenElse( Expression.LessThanOrEqual(pDate, pMax), Expression.Assign(pResult, pDate), Expression.Assign(pResult, pMax)) ); break; case e_limDirection.Right: block = Expression.Block( Expression.IfThenElse( Expression.GreaterThanOrEqual(pDate, pMin), Expression.Assign(pResult, pDate), Expression.Assign(pResult, pMin)) ); break; case e_limDirection.Range: block = Expression.Block( Expression.IfThenElse( Expression.LessThanOrEqual(pDate, pMax), Expression.Assign(pTemp, pDate), Expression.Assign(pTemp, pMax)), Expression.IfThenElse( Expression.GreaterThanOrEqual(pDate, pMin), Expression.Assign(pResult, pTemp), Expression.Assign(pResult, pMin)) ); break; default: throw new Exception("Неверное значение параметра e_limDirection метода generateDynamicDir"); } BlockExpression resBlock = Expression.Block( typeof(DateTime), new[] { pResult, pTemp }, block, pResult ); return Expression.Lambda<Func<DateTime, DateTime>>(resBlock, pDate).Compile(); }
public static Func<DateTime, DateTime, double> generateLimitRange(e_limDirection direction) { ParameterExpression pMin = Expression.Parameter(typeof(DateTime)); ParameterExpression pMax = Expression.Parameter(typeof(DateTime)); ParameterExpression pDouble = Expression.Parameter(typeof(double)); Func<DateTime, DateTime, double> fncRange = (min, max) => { double result = max.Subtract(min).Days; return (result < 0) ? 0 : result; }; Expression<Func<DateTime, DateTime, double>> lmbRange = (min, max) => fncRange(min, max); BlockExpression block = Expression.Block(typeof(double), cDNull); switch (direction) { case e_limDirection.Fixed: block = Expression.Block( typeof(double), new[] { pDouble }, Expression.Assign(pDouble, cDNull), pDouble ); break; case e_limDirection.Right: case e_limDirection.Left: block = Expression.Block( typeof(double), new[] { pDouble }, Expression.Assign(pDouble, cDUnlim), pDouble ); break; case e_limDirection.Range: block = Expression.Block( typeof(double), new[] { pDouble }, Expression.Assign(pDouble, Expression.Invoke(lmbRange, pMin, pMax)), pDouble ); break; } return Expression.Lambda<Func<DateTime, DateTime, double>>(block, pMin, pMax).Compile(); }