我有以下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;
}
}
我的问题是,在添加元素之前,我该如何验证该项目?如果邮件格式正确,我会验证。
答案 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)
您应该创建Add
,SetItem
和InsertItem
的新版本:
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;
}
}