从IList <>返回ReadOnlyCollection

Den*_*dic 12 .net c# nhibernate ilist readonly-collection

好的,所以List <>包含AsReadOnly(),它为您提供了ReadOnlyCollection.我需要的是有一个IList类型的字段,以及一个将为此列表返回ReadOnlyCollection的属性.

示例类:

class Test
{
   private IList<Abc> list;

   public AddToList(Abc someItem) { /* adds inside the list */... }

   public ReadOnlyCollection<Abc> List { get { return ??? } } // <- no "set" here!
}
Run Code Online (Sandbox Code Playgroud)

方案如下:当项目添加到列表中时,我需要在我的类中有一些自定义逻辑,我想通过调用AddToList(someitem)来限制添加到此列表,同时不允许使用list.Add( someItem).问题是,我使用的NHibernate需要IList接口,所以我不能投/呼吁的IList的AsReadOnly()(不包含此方法).

你会以什么方式来解决这种情况?我只需要一种方法让NHibernate以某种方式设置所需的集合,但我还需要限制用户.

Dan*_*rth 26

你可以模仿AsReadOnly():

public ReadOnlyCollection<Abc> List
{
    get { return new ReadOnlyCollection<Abc>(list); }
}
Run Code Online (Sandbox Code Playgroud)

更新:
这不会创建副本list.ReadOnlyCollection不复制数据,它直接在提供的列表上工作.见文档:

只读集合只是一个带有包装器的集合,可以防止修改集合; 因此,如果对基础集合进行了更改,则只读集合会反映这些更改.
该构造函数是O(1)操作.

  • 它不会创建副本。这与 `AsReadOnly` 中使用的代码完全相同。如果你不想要这种行为,你应该重新表述你的问题。 (2认同)

Yah*_*hia 6

尝试

return new ReadOnlyCollection<Abc> (list);
Run Code Online (Sandbox Code Playgroud)

  • @Yahia:错了.它不会创建副本 (2认同)