具有隐藏选项的枚举器

  • 本文关键字:枚举 选项 隐藏 c#
  • 更新时间 :
  • 英文 :


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

所以我有下一个结构:

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

我想实现的目标:

当某些样式(项目)被添加到我要自动添加/修改/更新样式ID的样式中时。

换句话说,我想覆盖基本列表.add()行为。我该如何实现?

,或者我应该在样式类中添加此方法:

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

隐藏默认List.add()方法?

最好的做法是自己实现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>继承不是一个好主意的更多详细信息。

您应该几乎总是避免隐藏基类方法。因为这很容易被诸如:

之类的代码击败
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

IMHO,唯一可接受的方法用于方法隐藏的用例是在诸如IEnumerable<T>.GetEnumerator()隐藏IEnumerable.GetEnumerator()之类的情况下,这两种方法无论如何都完全相同。