Reputation: 1379
I have a class OrderRequestModel with 10 properties.
I would like to throw exception if any of the properties is null but do not want to do 10 if checks.
How can i do this smartly?
if (model is DeliveryRequestModel)
{
if (model.Items == null || !model.Items.Any())
{
throw (new ArgumentException("За доставка трябва да има поне един артикул!"));
}
if ((model as DeliveryRequestModel).DocumentType_Id != 1 & (model as DeliveryRequestModel).DocumentType_Id != 5)
{
errors.Add(new ArgumentException("Доставката може да бъде само от тип фактура или стокова разписка. Фактурата е документ от тип 1, а стоковата разписка е документ от тип 5"));
}
}
if (model is SaleRequestModel)
{
if (!model.Items.Any())
{
errors.Add(new ArgumentNullException("За продажба трябва да има поне един артикул!"));
}
}
if (model.PaymentMode_Id != 1 & model.PaymentMode_Id != 2)
{
errors.Add(new ArgumentException("Не съществува такъв начин на плащане. Моля подайте начин за плащане 1 за в брой или 2 за банков превод"));
}
if (model.VatRate_Id != 1 & model.VatRate_Id != 2)
{
errors.Add(new ArgumentException("Не съществува такава данъчна ставка. Моля избере 1 за без ДДС или опция 2 за ДДС"));
}
else
{
var vatRate = await db.VatRates.AsNoTracking().FirstAsync(r => r.Id == model.VatRate_Id);
foreach (var item in model.Items)
{
item.VatBase = item.Quantity * (item.UnitPrice - item.Discount);
item.Vat = item.VatBase * vatRate.Amount / 100;
item.Total = item.VatBase + item.Vat;
}
}
if (model.Currency_Code != "BGN" & model.Currency_Code != "EUR")
{
errors.Add(new ArgumentException("Не съшествува такува валута. Моля изберете BGN за левове или EUR за евро"));
}
var codes = model.Items.Select(i => i.Goods_Code).Distinct();
var goodsNotFound = codes.Where(c => !db.Goods.Any(g => g.Code == c)).ToList();
if (goodsNotFound.Any())
{
errors.Add(new ArgumentException($"Продукт(и) с кодове {string.Join(", ", goodsNotFound)} не съществуват."));
}
if (model.Items.Any(i => i.Quantity <= 0))
{
errors.Add(new ArgumentException("Продажбите трябва да имат поне един артикул!"));
}
if (model.Items.Any(i => i.UnitPrice <= 0))
{
errors.Add(new ArgumentException("Цената на артикула трябва да е по-голяма от 0!"));
}
if (model.Items.Any(i => i.Discount < 0))
{
errors.Add(new ArgumentException("Продуктите не могат да имат отрицателна отстъпка!"));
}
if (model.Items.Any(i => i.UnitPrice <= i.Discount))
{
errors.Add(new ArgumentException("Продуктите не могат да имат отстъпка по-голяма или равна на цената на артикула!"));
}
var company = await db.Companies.FirstOrDefaultAsync(c => c.UIC == model.UIC);
if (company == null)
{
errors.Add(new ArgumentException("Не съществува компания с такъв ЕИК"));
}
if (errors.Any())
{
throw new ArgumentException(string.Join("; ", errors).Replace("System.ArgumentException: ", ""));
}
return company.Id;
}
All those models properties I have to check them if they are null, so when the user send a JSON and one of the object he specified is null, to throw a message different from:
"Error converting value {null} to type 'System.Int32'. Path 'DocumentType_Id', line 2, position 24."
Which is the error I get from Postman.
Upvotes: 0
Views: 72
Reputation: 1052
Use reflection like below:
List<string> values = typeof(FilterParams)
.GetProperties()
.Select(prop => prop.GetValue(model, null));
if (values.Count > 0) {
// there are null values
}
Upvotes: 3