使用特殊字符重构检查属性值

时间:2013-08-20 12:17:29

标签: c# refactoring

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”语句实现

2 个答案:

答案 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