问题描述
我正在尝试编写一个简单的控制台应用程序,其中有一个如下所示的User类:
class User
{
public string Name { get; set; }
public int Age { get; set; }
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
我的目标是从用户那里获取每个属性的输入,但是我想检查用户输入是否 符合特定标准。例如:当用户尝试为Name属性输入值时,我想检查输入的值是否以大写字母开头,包含数字,少于五十个字符等,以及输入的值是否不是有效,然后抛出异常并要求用户重试,如果有效,则移至下一个属性,依此类推。
我的问题是我无法弄清楚如何简化此过程,因为如果我的财产必须满足一百个条件,会发生什么情况。
有没有一种简单的方法来检查用户输入是否满足很多条件,如果不满足,我抛出异常,显示随机错误消息,然后用户可以重试。
解决方法
一种非常简单的方法是为任何给定的类创建ValidationCriterias字典和相应的错误消息。由于进行了用户输入验证检查,因此我只会抛出一条有效的友好错误消息,而不是抛出异常,因为这种错误已经预料到了。
即使有任何一个失败,下面的代码也会运行所有验证条件,并最终以管道分隔的字符串输出所有错误消息。 如果至少有一个条件失败,则该函数将返回false。
public class User
{
public string Name { get; set; }
public int Age { get; set; }
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
public class ValidateProps<T> where T: class
{
public static bool RunRules(Dictionary<Expression<Func<T,bool>>,string> lst,T myObj,out string errorMessages)
{
errorMessages = "";
bool isSuccess = true;
foreach (var l in lst)
{
if (l.Key.Compile()(myObj) == false) isSuccess = false;
errorMessages += l.Key.Compile()(myObj) == true ? "" : "|" +l.Value;
}
errorMessages = errorMessages.Trim('|');
return isSuccess;
}
}
// Example Usage
User u = new User() { Name = "dd23dd",Age = 100 };
Dictionary<Expression<Func<User,string> dict1 =
new Dictionary<Expression<Func<User,string>()
{ {x => Char.IsUpper(x.Name.ToCharArray().ElementAt(0)),"Error Message 1" },{x => !(x.Name.Any(char.IsDigit)),"Error Message 2"},};
string errorMsgs = "";
bool n1 = ValidateProps<User>.RunRules(dict1,u,out errorMsgs);