private bool? Between(FilterContext context, IFilterTarget target, ContentFilterElement element)
{
FilterOperand[] operands = GetOperands(element, 3);
object value = GetValue(context, operands[0], target);
object min = GetValue(context, operands[1], target);
object max = GetValue(context, operands[2], target);
// the min and max could be different data types so the implicit conversion must be done twice.
object lhs = value;
DoImplicitConversion(ref lhs, ref min);
bool? result = null;
if (lhs is IComparable && min is IComparable)
{
// check if never in range no matter what happens with the upper bound.
if (((IComparable)lhs).CompareTo(min) < 0)
{
return false;
}
result = true;
}
lhs = value;
DoImplicitConversion(ref lhs, ref max);
if (lhs is IComparable && max is IComparable)
{
// check if never in range no matter what happens with the lower bound.
if (((IComparable)lhs).CompareTo(max) > 0)
{
return false;
}
// can't determine if in range if lower bound could not be resolved.
return result != null;
}
// return null if the types are not comparable.
return null;
}