如何重写List.Add方法?

3

目前我有一个错误日志记录类,代码如下:

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个回答

11
首先,我不会这样做。这不是任何使用 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类型中删除设置器-在构造之后为什么需要更改消息或类型呢?


    我选择了Logger类。感谢您的建议! - kravits88

    1
    你可以创建一个继承自 List 的类,并为你的需求定义新的 Add 方法,例如:
    public class MyListClass : List<Log>
    {
        public void Add(string message, Log.LogTypes logType)
        {
            this.Add(new Log(message, logType));
        }
    }
    

    但这并不是覆盖重写的。 - Sriram Sakthivel
    @SriramSakthivel:鉴于该方法不是现有类的一部分,因此使用给定方法进行覆盖是不可能的。 OP只是混淆了重载和覆盖,这是一个相当常见的错误。 - Jon Skeet
    @JonSkeet 哦..我因为override关键字而忽略了它 :( - Sriram Sakthivel

    0

    除了节省一两秒的打字时间之外,这不会有任何区别。话虽如此,你总是可以实现自己的列表类并使用它。或者你可以利用扩展方法。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接