具有隐藏选项的枚举器

时间:2015-05-04 18:29:29

标签: c#

我正在尝试创建一个excel文档生成器项目。目前我正在研究细胞样式部分。

所以我有下一个结构:

public class Styles : List<Style>, ISerializableClass
{
    ...some special methods...
}

我想要实现的目标:

当一些Style(项目)被添加到样式时,我想自动添加/修改/更新样式ID。

换句话说,我想覆盖基本list.Add()行为。 我如何实现这一目标?

或者我应该在我的Styles类中添加此方法:

public void Add(Style style)
    {
        /*
         * Some mu logic
        */
        base.Add(style);
    }

隐藏默认的List.Add()方法?

1 个答案:

答案 0 :(得分:2)

最佳做法是自己实施IList<T>,而不是继承List<T>。然后,您可以将大部分实施委托给List<T>字段:

public class Styles : IList<Style>, ISerializableClass
{
    private List<Style> _list = new List<Style>();

    public void Add(Style style)
    {
        // Your stuff here
        _list.Add(style);
    }

    // ...
}

有关继承List<T>不是一个好主意的原因的详细信息,请参阅this question

你应该几乎总是避免隐藏基类方法。因为这很容易被代码击败:

var stylesList = new Styles(); // Suppose this hides List<T>.Add
var castedList = (IList<Styles>)stylesList;
castedList.Add(new Style()); // <-- this still calls List<T>.Add

恕我直言,方法隐藏的唯一可接受的用例是IEnumerable<T>.GetEnumerator()隐藏IEnumerable.GetEnumerator()这样的情况,其中两种方法完全相同。