2016-02-26 64 views
3

我有一個包含私人列表的類。我創建了一個getter和將元素添加到列表中的方法:阻止List.Add()方法

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

因爲每次一個元素被添加到我的列表我想要做更多的事情,我不希望在代碼的人的某些部分直接添加元素:

Test test = new Test(); 

// Wrong 
test.MyList.Add(element); 

// Right 
test.AddElements(element); 

我曾想過在創建實現IList接口,並覆蓋Add()方法一個新的類,但我不知道是否有「塊」上更簡單的/優雅的方式這個Add()方法。

+1

如果你不希望有人能夠修改它,不要暴露'List'。您可以公開['ReadOnlyCollection'](https://msdn.microsoft.com/en-us/library/e78dcd75(v = vs.110).aspx),然後沒有人可以添加(除非他們使用反射)。 – Sinatr

回答

7

如果您至少使用.NET 4.5,請返回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); 
    } 
} 
+0

'((List )test.MyList).Add(....);'? –

+0

@JeroenvanLangen當然,但總有一種方法可以獲取數據。 –

+0

我認爲這工作得很好,它不會創建副本。像你說的。 「總有一種方法可以獲取數據」;-) –

1

如果你吸氣的唯一原因是添加你不需額外需要直接訪問的列表中的所有元素,但是你可以用呼叫轉移到Add - 方法到您自己的方法:

class MyClass<T> { 
    private List<T> _myList ... 

    public void AddElements(T element) 
    { 
     // Do dome stuff, subscribe to an event of T 
     _myList.Add(element); 
    } 
} 

暴露一個通用的列表,還通過CA1002

+0

不幸的是,我必須使用外部列表中的元素,所以我需要訪問它... – Ignacio

3

避免在測試類暴露List然後爲IReadOnlyList<T>你不會被允許使用MyList.Add直接

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

編輯已將IEnumerable更新爲IReadOnlyList。有使用IReadOnlyList的好處 - IEnumerable<T> vs IReadOnlyList<T>

2

我會回來爲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); 
    } 
} 

這樣,可以防止鑄造...這將有ReadOnlyCollection類包裝你List<>


或者你可以返回它作爲一個Array像:

public T[] MyList 
{ 
    get { return myList.ToArray(); } 
} 

當它返回一個IReadOnlyList<T>ToArray()方法將創建列表


副本。你可以簡單地把它扔回去..

Test test = new Test<int>(); 

test.AddElements(10); 

((List<int>)test.MyList).Add(20); 

foreach(var i in test.MyList) 
    Console.WriteLine(i);