从集合类设置只读属性

本文关键字:只读属性 设置 集合类 | 更新日期: 2023-09-27 18:06:01

解释我想要什么有点困难,但基本上,我想从集合类设置一个ReadOnly属性。我知道事情没那么简单。

public class ListItemCollection : CollectionBase {
      // other code
      public void Add(ListItem item) {
            item.Index = List.Count;  // want to set Index
            List.Add(item);
      }
}

我不希望listtitemcollection中的其他类改变该属性的值。

public class Form1 : Form
{
     private void Form_Load(....) {
          ListItem item = new ListItem;
          item.Index = 5; // I don't want people to set it.
     }
}

我知道这是可能的,因为ListViewItem设法做到了。

从集合类设置只读属性

如果您将ListItem放置在与ListItemCollection相同的程序集中,并为Index属性提供公共getter和内部setter,则可以这样做:

class ListItem {
    // other code
    public int Index {get; internal set;}
}

从技术上讲,它不会使属性成为readonly,但就ListItem类的其他用户而言,该属性似乎没有setter。

如果ListItem必须在不同的程序集中,您可以通过使用InternalsVisibleTo属性让ListItemCollection类看到setter。

您应该使用internal来代替set。这使得它可以从同一程序集中的类访问,但不能从程序集中的外部访问。

public int Index { get; internal set; }