1

次のクラス アルバムを検討してください。

public class Album
{
    public int? Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Photo> Photos { get; set; }
    public DateTime Registered { get; set; }
}

データを取得して、アルバムや写真コレクションを作成するのに問題はありません。

ただし、写真アイテムを写真コレクションに「追加」したいのですが、「追加」は写真で有効な方法として認識されません。

'System.Collections.Generic.IEnumerable' には 'Add' の定義が含まれておらず、タイプの最初の引数を受け入れる拡張メソッド 'Add' もありません....

IEnumerable で動作させるには、簡単なこととして何をすればよいですか? プロパティを変更したくない

public List<Photo> Photos { get; set;}

Album クラスに ICollection を実装する必要はありますか?

 public class Album : ICollection<Photo> { ... }
4

4 に答える 4

5

IList<Photo>プロパティ タイプを追加 (または)できるものに変更したくない場合はICollection<Photo>、次のように、画像を追加するための別のメソッドを追加します。

public void AddPhoto(Photo p) {
    ...
}

これIEnumerable<Photo>により、プロパティのタイプを保持し、発信者が入力したものを検証することもできます。たとえば、コードは写真が大きすぎるか小さすぎるかを検出し、例外をスローできます。IList<Photo>を公​​開すると、 をオーバーライドする独自の実装を提供する必要があるため、これを行うのははるかに困難になりますAdd

また、自動プロパティのセッターをプライベートにするか、自動プロパティをゲッター + バッキング フィールドに置き換える必要があります。

于 2013-05-18T11:15:54.143 に答える
1

Photos を非公開リストにしてから、それを IEnumerable として公開する標準プロパティを作成してみてください。次に、「AddPhoto」メソッドをアルバム オブジェクトに追加します。

このようにして、アルバムがアイテムを内部コレクションに追加する方法を制御できるようにします。

public class Album
{
    private List<Photo> _photos = new List<Photo>();

    public IEnumerable<Photo> Photos { get { return _photos; } }

    public void AddPhoto(Photo photo)
    {
        _photos.Add(photo);
    }
}

*編集これはdasblinkenlightへの同様の回答ですが、より肉付けされたコードがあります。少し説明を追加するので、ここでは残しておきます。

于 2013-05-18T11:28:55.003 に答える
0

IEnumerable<T>列挙中にシーケンスを変更することはできません。ICollection<T>やなどの別のインターフェイスを使用する以外に方法はありませんIList<T>

Photosように見えるように

public IList<Photo> Photos { get; set;}
// or
public ICollection<Photo> Photos { get; set;}

もちろん、インターフェイスではなく実際のクラスを使用することもできますが、通常、インターフェイスを使用するとより自由になります。

于 2013-05-18T11:17:11.350 に答える
0

試す:

myAlbum.Photos = myAlbum.Photos.Concat(newPhoto);

using System.Linq;ファイルの上に追加する必要があります。

于 2013-05-18T11:18:06.773 に答える