9

在我的域对象中,我将 1:M 关系与 IList 属性映射。

为了获得良好的隔离,我以这种方式将其设为只读:

private IList<PName> _property;
public ReadOnlyCollection<PName> Property
{
    get
    {
        if (_property!= null)
        {
            return new ReadOnlyCollection<PName>(new List<PName>(this._property));
        }
    }
}

我不太喜欢 ReadOnlyCollection,但没有找到使集合成为只读的接口解决方案。

现在我想编辑属性声明以使其返回空列表而不是null当它为空时,所以我以这种方式编辑它:

if (_property!= null)
{
    return new ReadOnlyCollection<PName>(new List<PName>(this._property));
}
else
{
    return new ReadOnlyCollection<PName>(new List<PName>());
}

但是Property当我在测试中得到它时总是为空。

4

4 回答 4

9

由于它是只读且为空的,因此将其存储在静态中是安全的:

private static readonly ReadOnlyCollection<PName> EmptyPNames = new List<PName>().AsReadOnly();

然后在您需要的任何地方重复使用它,例如:

if (_property!= null)
{
    return new ReadOnlyCollection<PName>(new List<PName>(this._property));
}    
else
{
    return EmptyPNames;
}
于 2015-11-26T10:27:13.840 回答
1

也许您可以使用 IEnumerable 而不是 ReadOnlyCollection :

private IList<PName> _property = new List<PName>();
public IEnumerable<PName> Property
{
    get
    {
        return _property;
    }
}
于 2013-09-17T14:28:32.587 回答
1

如果您将默认值设置为 IList

private IList<PName> _property = new IList<PName>();
public ReadOnlyCollection<PName> Property
{
    get
    {
        return _property
    }
}
于 2013-09-17T14:28:49.080 回答
0

其他可能的解决方案是以这种方式编辑类构造函数:

public MyObject (IList<PName> property)
{
  this._property = property ?? new List<PName>();
}
于 2013-09-18T11:16:45.087 回答