在添加到集合之前验证

时间:2015-07-20 11:29:36

标签: c#

我有以下ObservableCollection固有的类:

public class Emails : ObservableCollection<Email>
    {
        public Emails()
        {
        }

        public Emails(IEnumerable<Email> emails)
        {
            foreach (var e in emails)
            {
                //   Will throw System.FormatException:
                //     address is not in a recognized format.
                var addr = new System.Net.Mail.MailAddress(e.Address);
                Add(e);
            }
        }

        public IEnumerable<Email> GetAll()
        {
            return Items;
        }

    }

我的问题是,在添加元素之前,我该如何验证该项目?如果邮件格式正确,我会验证。

4 个答案:

答案 0 :(得分:2)

这里和其他论坛上有许多关于电子邮件验证问题的主题。普遍的共识是:不要。特别是不要使用正则表达式来做到这一点。

一种有效的方法是将电子邮件发送到该地址并检查是否成功。

另一方面,您的代码注释已经提供了有关抛出异常的提示。如果您按如下方式更改代码,则只能添加有效地址:

public Emails(IEnumerable<Email> emails)
{
        List<Email> invalid = new List<Email>();

        foreach (var e in emails)
        {
            //   Will throw System.FormatException:
            //     address is not in a recognized format.
            try
            {
                var addr = new System.Net.Mail.MailAddress(e.Address);
                Add(e);
            }
            catch (FormatException)
            {
                // The address was invalid. Add to a list of invalid
                // addresses
                invalid.Add(e);
            }
        }
}

这将生成无效地址列表,并将有效地址添加到您的集合中。

答案 1 :(得分:0)

您可以使用正则表达式进行检查:

Regex emailRegex = new Regex(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$");
if (emailRegex.IsMatch(e.Address) {
     //valid eMail address
}

答案 2 :(得分:0)

您应该创建AddSetItemInsertItem的新版本:

public class Emails : ObservableCollection<Email> {
    public Emails() {
    }

    public Emails(IEnumerable<Email> emails) {
        foreach (var e in emails) {
            Add(e);
        }
    }

    public IEnumerable<Email> GetAll() {
        return Items;
    }

    protected bool InsertItem(int index, Email item, bool throwOnInvalidEmailAddress = false) {
        if (IsValidEmailAddress(item.Address)) {
            base.InsertItem(index, item);
            return true;
        }
        if (throwOnInvalidEmailAddress)
            throw new Exception("Bad email address!");
        return false;
    }

    protected bool SetItem(int index, Email item, bool throwOnInvalidEmailAddress = false) {
        if (IsValidEmailAddress(item.Address)) {
            base.SetItem(index, item);
            return true;
        }
        if (throwOnInvalidEmailAddress)
            throw new Exception("Bad email address!");
        return false;
    }

    public bool Add(Email item, bool throwOnInvalidEmailAddress = false) {
        if (IsValidEmailAddress(item.Address)) {
            base.Add(item);
            return true;
        }
        if (throwOnInvalidEmailAddress)
            throw new Exception("Bad email address!");
        return false;
    }

    private static readonly Regex EmailValidatorRegex = 
        new Regex(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$");
    private bool IsValidEmailAddress(string address) {
        return !string.IsNullOrWhiteSpace(address) && EmailValidatorRegex.IsMatch(address);
    }
}

注1:已使用的Regex来自@LInsoDeTeh 's answer

注意2:您可以使用提供的throwOnInvalidEmailAddress参数来决定如何处理无效地址,例如忽略它们,抛出异常,......

答案 3 :(得分:0)

there那样做。 然后在构造函数中使用它:

public class Emails : ObservableCollection<Email>
{
   public Emails()
   {
   }

   public Emails(IEnumerable<Email> emails)
   {
      foreach (var e in emails)
      {
        if(IsValidEmail(e.Address)
        {
          Add(e);
        }
      }
   }

  public IEnumerable<Email> GetAll()
  {
     return Items;
  }    
}