4

我的类继承了一个接口,所以我需要在 Person 类中有 emailaddress 属性。

我的问题是获取属性和设置属性的最佳方法是什么

public class Contact : IPerson, ILocation
{
  ...
  [MaxLength(256)]
  public string EmailAddress { 
  get{
    return this.Emails.First().ToString();
  } 
  set{ ????  }
  }
  ....

  public virtual ICollection<Emails> Emails { get; set; }
}

本质上,我试图让班级允许不止一封电子邮件。

为了充分披露,我对此很陌生,我可能没有问正确的问题,但我已经搜索了一天半并且没有看到这样的东西(不是我认为它不寻常)并且可以使用洞察力。

电子邮件类属性:

[Key]
public int Id { get; set; }

[MaxLength(256)]
    public string EmailAddress { get; set; }
4

4 回答 4

1

您是否可以控制IPerson迫使您实施的界面设计EmailAddress?如果是这样,我建议重新考虑设计以避免在同一对象上同时需要单个属性和电子邮件地址列表。

您可能还需要考虑制作Emails属性 setter protected,以防止外部代码更改对象的数据。

如果您必须实现此接口,并且希望该EmailAddress属性始终引用集合中的第一封电子邮件,您可以尝试此代码。

public class Contact : IPerson, ILocation
{
  public Contact()
  {
    // Initialize the emails list
    this.Emails = new List<Emails>();
  }

  [MaxLength(256)]
  public string EmailAddress
  { 
    get
    {
      // You'll need to decide what to return if the first email has not been set.
      // Replace string.Empty with the appropriate value.
      return this.Emails.Count == 0 ? string.Empty : this.Emails[0].ToString();
    } 
    set
    {
      if (this.Emails.Count == 0)
      {
        this.Emails.Add(new Emails());
      }
      this.Emails[0].EmailAddress = value;
    }
  }

  public virtual IList<Emails> Emails { get; set; }
}
于 2012-12-31T04:22:06.437 回答
0

编辑:起初我不明白这个问题。

在这种情况下,我不确定您尝试做的事情是否有意义。您正在从 getter 上的电子邮件集合中取出第一封电子邮件;那么你想要二传手的行为是什么?它可以 (a) 将设置值更新或插入到集合中的第一个位置,或者 (b) 只需在设置时将电子邮件添加到集合中。我不确定我是否会允许设置它,只需获取并保留它。

我还将重命名属性 FirstEmail 或其他名称,因此很明显它来自可能的电子邮件集合。

  public string FirstEmailAddress { 
      get{
         return this.Emails.Count > 0 ? this.Emails.First().ToString() : string.Empty;
      } 
  }
于 2012-12-31T04:09:08.210 回答
0

通常,当您想向世界“展示”一个内部集合时,您所做的就是将其设为属性并仅创建一个 getter。这样您就不能将整个集合设置为Contact.Emails = new ICollection<Email>(),这是一种不好的做法。但是您可以通过它访问集合Contacts.Emails并对其进行迭代或添加项目等。

如果您愿意,还可以向此属性添加索引器:http: //msdn.microsoft.com/en-us/library/vstudio/6x16t2tx (v=vs.100).aspx

于 2012-12-31T04:17:05.727 回答
0

从你的评论来看,

我在联系人和他们的电子邮件之间有一对多(因此是集合)。因为我继承了一个接口,所以我不能排除 EmailAddress 属性(从接口中)。所以我不知道从哪里拿它。我可以忽略这个集合,只通过关系来做吗?

你不应该允许public二传手。让它protected像你标记的虚拟一样。

public virtual ICollection<Emails> Emails { get; protected set; }

对于您的 EmailAddress 设置器,您可以使用以下

[MaxLength(256)]
public string EmailAddress 
{ 
    get
    {
        return this.Emails.DefaultIfEmpty(new EMail()).First().EmailAddress;
    } 
    set
    {
        if (Emails == null)
        {
            Emails = new Collection<Email>(); 
        }
        Emails.Items.Insert(0, new EMail {EmailAddress = value}); 
    }
}
于 2012-12-31T04:32:37.463 回答