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

我真的需要在我的专辑类上实现 ICollection 吗?

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

4 回答 4

5

如果您不想将属性类型更改为允许添加(IList<Photo>ICollection<Photo>)的内容,请添加单独的添加图片方法,如下所示:

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

这将使您保留IEnumerable<Photo>属性的类型,并允许验证调用者输入的内容。例如,您的代码将能够检测照片是否太大或太小,并抛出异常。如果您公开IList<Photo>,这将更加困难,因为您需要提供自己的实现来覆盖Add.

您还应该将 auto 属性的 setter 设为私有,或者将 auto 属性替换为 getter + 支持字段。

于 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>or 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 回答