Question

I have class with DateTime? properties. In general they are pair (request/receive) of dates. I used FluentValidation in my project. Can I write validator which will receive two DateTime? params? Conditions:

  1. Request must be less or equal to Receive
  2. Receive can't be set when Request is null

Probably I will have more conditions in future.

Was it helpful?

Solution

You can't use LessThanOrEqualTo extension method, as it's not available for nullable datetimes.

One thing is still not clear, but I may guess : if Receive is null, Request can have any value (even null), right ?

You could do something like that (I used a class Item, with the same properties as yours), managing your two rules in one step :

public ItemValidator()
        {
            RuleFor(m => m.Request)
                .Must((x, y) => CheckRequestAndReceive(x));
        }

        private static bool CheckRequestAndReceive(Item item)
        {
            //Reveive can't be set when Request is null
            if (item.Request == null)
                return item.Receive == null;

            //Request can be anything if Receive is null
            if (item.Receive == null)
                return true;

            //Request must be less or equal to Receive   
            return item.Receive.Value >= item.Request.Value;
        }

Tests :

var item = new Item
    {
       Receive = DateTime.Now
     };
var errors = new ItemValidator().Validate(item);// => ERROR

var item2 = new Item()
    {
       Request = DateTime.Now
    };
errors = new ItemValidator().Validate(item2); //=> OK

var dt = DateTime.Now;
var item3 = new Item
    {
       Receive = dt,
       Request = dt
    };
errors = new ItemValidator().Validate(item3); //=> OK

var item4 = new Item
    {
        Receive = DateTime.Now,
        Request = DateTime.Now.AddDays(1)
    };
errors = new ItemValidator().Validate(item4); //=> ERROR
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top