如何覆盖List.Add方法?

kra*_*s88 3 .net c# overriding c#-4.0

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

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;
    }
Run Code Online (Sandbox Code Playgroud)

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

List<Log> LogList = new List<Log>();
Run Code Online (Sandbox Code Playgroud)

我该如何使用LogList.Add(Message, LogType)而不是LogList.Add(new Log(Message, LogType));

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

Jon*_*eet 9

首先,我不会这样做.这不是任何人使用a 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));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    LogList list = new LogList();
    list.Add(message, type);
    
    Run Code Online (Sandbox Code Playgroud)
  • 添加扩展方法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));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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