gpt4 book ai didi

c# - 如何覆盖 List.Add 方法?

转载 作者:行者123 更新时间:2023-11-30 13:37:32 25 4
gpt4 key购买 nike

目前我有一个这样的错误记录类:

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# 并且很好奇。谢谢!

最佳答案

首先,我不会这样做。这不是任何人使用 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类型 - 为什么您需要能够在构造后更改消息或类型?

关于c# - 如何覆盖 List.Add 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22165015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com