Хорошая идея отделить проверку контента от ошибок формата контента. Если вы хотите разделить проверку контента и ввод данных, я бы go сделал следующее: просто полностью разделил валидацию в классе stati c. В классе вы можете проверить тип, который вы хотите проверить, в общем случае c. Когда условия для всех полей одного типа похожи, что-то вроде
public static class StockInputFieldValidator
{
public static bool ValidateItem<T>(object o)
{
if (typeof(T) == typeof(int)) return ((int) o > 0);
if (typeof(T) == typeof(float)) return ((float) o > 0);
if (typeof(T) == typeof(decimal)) return ((decimal) o > 0);
if (typeof(T) == typeof(string)) return !string.IsNullOrWhiteSpace((string) o);
return true;
}
}
public static class ValidatedStockInputReader
{
static void ReadItem(string caption, out string s)
{
while (true)
{
Console.Write(caption + ">");
string result = Console.ReadLine();
if (StockInputFieldValidator.ValidateItem<string>(result))
{
s = result;
return;
}
Console.WriteLine("Please provide valid "+result?.GetType().Name+ " input for " + caption);
}
}
static void ReadItem(string caption, out DateTime s)
{
while (true)
{
Console.Write(caption + ">");
if (DateTime.TryParse(Console.ReadLine(), out DateTime result))
if (StockInputFieldValidator.ValidateItem<DateTime>(result))
{
s = result;
return;
}
else Console.WriteLine("Invalid value for " + caption);
Console.WriteLine("Please provide valid "+ result.GetType().Name+" input for " + caption);
}
}
static void ReadItem(string caption, out int s)
{
while (true)
{
Console.Write(caption + ">");
if (int.TryParse(Console.ReadLine(), out int result))
if (StockInputFieldValidator.ValidateItem<int>(result))
{
s = result;
return;
}
else Console.WriteLine("Invalid value for " + caption);
Console.WriteLine("Please provide valid " + result.GetType().Name + " input for " + caption);
}
}
static void ReadItem(string caption, out decimal s)
{
while (true)
{
Console.Write(caption + ">");
if (decimal.TryParse(Console.ReadLine(), out decimal result))
if (StockInputFieldValidator.ValidateItem<decimal>(result))
{
s = result;
return;
}
else Console.WriteLine("Invalid value for " + caption);
Console.WriteLine("Please provide valid " + result.GetType().Name + " input for " + caption);
}
}
public static void GetStockInput(out int citemid, out string citemname, out int citemquantity, out decimal citemprice, out DateTime citemdate)
{
ReadItem("Item ID:", out citemid);
Console.WriteLine("Input was itemid=" + citemid);
ReadItem("Item Name:", out citemname);
Console.WriteLine("Input was itemname=" + citemname);
ReadItem("Quantity:", out citemquantity);
Console.WriteLine("Input was quantity=" + citemquantity);
ReadItem("Price:", out citemprice);
Console.WriteLine("Input was itempricepaid=" + citemprice);
ReadItem("Date:", out citemdate);
Console.WriteLine("Input was itemdatetime=" + citemdate);
}
}