阻止List.Add()方法

时间:2016-02-26 12:14:23

标签: c# .net

我有一个包含私人列表的类。我创建了一个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);
    }
}

因为每次将一个元素添加到我的列表中时我想做更多的事情,我不希望在代码的某些部分有人直接添加元素:

Test test = new Test();

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

// Right
test.AddElements(element);

我已经考虑过创建一个实现IList接口的新类并重写Add()方法,但我想知道是否有一个更简单/更优雅的方法来阻止这个Add()方法。

4 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:3)

在Test类中将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 :(得分:3)

我会以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(); }
}

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

答案 3 :(得分:1)

如果你的getter的唯一原因是添加元素你根本不需要直接访问列表,但是你可以将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

进一步避免公开通用列表