我有一个包含私人列表的类.我创建了一个getter和一个向列表中添加元素的方法:
public class Test{
private List<T> myList;
public List<T> MyList
{
get { return myList; }
}
public Test()
{
myList = new List<T>();
}
public void AddElements(T element)
{
// Do dome stuff, subscribe to an event of T
myList.Add(element);
}
}
Run Code Online (Sandbox Code Playgroud)
因为每次将一个元素添加到我的列表中时我想做更多的事情,我不希望在代码的某些部分有人直接添加元素:
Test test = new Test();
// Wrong
test.MyList.Add(element);
// Right
test.AddElements(element);
Run Code Online (Sandbox Code Playgroud)
我曾想过创建一个实现IList接口的新类并重写Add()方法,但我想知道是否有一个更简单/更优雅的方法来阻止这个Add()方法.
如果您至少使用.NET 4.5,请返回a IReadOnlyList<T>.
public class Test{
private List<T> myList;
public IReadOnlyList<T> MyList
{
get { return myList; }
}
public Test()
{
myList = new List<T>();
}
public void AddElements(T element)
{
// Do dome stuff, subscribe to an event of T
myList.Add(element);
}
}
Run Code Online (Sandbox Code Playgroud)
我会回来 ReadOnlyCollection<T>
像这样使用它:
public class Test<T>
{
private List<T> myList;
public ReadOnlyCollection<T> MyList
{
get { return myList.AsReadOnly(); }
}
public Test()
{
myList = new List<T>();
}
public void AddElements(T element)
{
// Do dome stuff, subscribe to an event of T
myList.Add(element);
}
}
Run Code Online (Sandbox Code Playgroud)
这样你就可以防止强制转换......它会List<>用 ReadOnlyCollection 类包装你。
或者你可以Array像这样返回它:
public T[] MyList
{
get { return myList.ToArray(); }
}
Run Code Online (Sandbox Code Playgroud)
该ToArray()方法将创建列表的副本
当它作为IReadOnlyList<T>. 你可以简单地把它扔回去..
Test test = new Test<int>();
test.AddElements(10);
((List<int>)test.MyList).Add(20);
foreach(var i in test.MyList)
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |