如何覆盖List.Add方法?

时间:2014-03-04 06:56:51

标签: c# .net c#-4.0 override

目前我有一个错误记录类,如下所示:

public class Log
{
    public enum LogTypes
    {
        Info = 1,
        Error = 2,
        Warning = 3
    }


    public string Message { get; set; }
    public LogTypes LogType { get; set; }


    public Log(string Message, LogTypes LogType)
    {
        this.Message = Message;
        this.LogType = LogType;
    }

我有一个新列表的初始化器:

List<Log> LogList = new List<Log>();

如何使用LogList.Add(Message, LogType)代替LogList.Add(new Log(Message, LogType));

我知道这是一个小小的改变,但我仍在学习C#并且很好奇。谢谢!

3 个答案:

答案 0 :(得分:9)

首先,我不会这样做。这不是任何使用List<Log>的人所期望的。不要暴露普通的List<Log>,而是考虑创建一个Logger类或类似的包含一个List<Log>并公开Log(string message, LogType type)方法,但不要实际上是暴露了List<Log>

如果确实希望能够直接在列表中调用Add(message, type),则有两种选择:

  • 创建一个派生自List<Log>的新类:

    public LogList : List<Log>
    {
        public void Add(string message, LogType type)
        {
            Add(new Log(message, type));
        }
    }
    

    请注意,这是重载(添加新方法签名但名称相同,Add),而不是重写(为现有提供新行为) virtual方法的签名方法 - 您需要创建LogList而不是List<Log>的实例:

    LogList list = new LogList();
    list.Add(message, type);
    
  • List<Log>添加扩展方法,这将有效地将该方法添加到所有 List<Log>实例。

    public static LogListExtensions
    {
        public static void Add(this Log<List> list, string message, LogType type)
        {
            list.Add(new Log(message, type));
        }
    }
    

顺便说一句,我可能也会从你的Log类型中删除这些setter - 为什么你需要在构造后更改消息或类型?

答案 1 :(得分:1)

您可以创建自己的List派生类,并根据需要定义新的Add方法,例如:

public class MyListClass : List<Log>
{
    public void Add(string message, Log.LogTypes logType)
    {
        this.Add(new Log(message, logType));
    }
}

答案 2 :(得分:0)

除了保存第二或第二次打字之外,它没有任何区别。说过你总是可以实现自己的列表类并使用它。或者你可以使用扩展方法。