I have some class:
public class AddressViewModel
{
public string Index { get; set; }
public string Area { get; set; }
public string StreetName { get; set; }
public string Home { get; set; }
...
}
string specialCharacters = @"~!@#$%^&*_+|{}:""<>?[];'/=\№";
我有检查方法:
private bool CompareCharacters(string specialCharacters, AddressViewModel x)
{
if (x.Index.Any(specialCharacters.Contains) ||
x.Area.Any(specialCharacters.Contains) || ...)
return false;
else
return true;
}
我如何重构此方法?我不喜欢“if”语句实现
答案 0 :(得分:4)
那么你可以从返回声明开始:
private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
return !x.Index.Any(specialCharacters.Contains) &&
!x.Area.Any(specialCharacters.Contains);
}
你需要来改变呼叫之间的specialCharacters
吗?如果没有,您可以将其作为参数删除,并且只有一个私有常量字段。您可能还想提取一个私有方法来比较单个字符串,以便您可以调用:
private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
return ValidateCharacters(x.Index) &&
ValidateCharacters(x.Area);
}
或者如果你有很多字符串,你甚至可以(在性能开销很小的情况下)创建一个带有params
参数的方法,并使用:
private bool ValidateCharacters(string specialCharacters, AddressViewModel x)
{
return ValidateCharacters(x.Index, x.Area, x.StreetName, x.Home, ...);
}
答案 1 :(得分:2)
据我了解您的问题,您希望的行为是检查您的属性是否包含specialCharacters字符串中的任何字符。如果不是这样,我道歉......
无论如何,我会使用正则表达式。您在specialCharacters中列出的大多数字符都应该转义为正则表达式。所以代码看起来像:
string specialCharacters = @"\~|!|\@|\#|\$|%|\^|\&|\*|_|\+|\||\{|\}|:\""|\<|\>|\?|\[|\]|;|'|/|=|\\|№";
public bool ValidateCharacters(string pattern, AddressViewModel model)
{
var reg = new Regex(pattern);
return reg.IsMatch(model.Index) == false && reg.IsMatch(model.Area) == false;
}
我对名称做了一些重构,我宁愿让这个方法成为AddressViewModel的成员函数。此外,还有非常好的关于.Net框架支持的验证的文章,例如this。