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; }
}

基本的に、クラスで複数の電子メールを許可しようとしています。

完全な開示のために、私はこれにかなり慣れていないため、正しい質問をしていない可能性がありますが、1日半検索しましたが、このようなものは見たことがなく(珍しいとは思いません)、使用できます洞察。

電子メール クラスのプロパティ:

[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

編集:私は最初は質問を理解していませんでした。

この場合、あなたが何をしようとしているのかわかりません。ゲッター上の電子メールのコレクションから最初の電子メールを取り出しています。それで、あなたはセッターにどのような行動を望みますか?(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

あなたのコメントから、

連絡先とその電子メールの間に 1 対多があります (したがって、コレクション)。インターフェイスを継承しているため、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 に答える