2014-03-04 72 views
2

目前,我有一个错误记录类,像这样:如何重载List.Add方法?

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

回答

8

首先,我不会这么做。这不是什么人使用List<Log>预期。考虑创建一个Logger类或类似包含 a List<Log>并且公开Log(string message, LogType type)方法,但实际上不公开List<Log>而不是实际公开List<Log>

如果你真的希望能够直接调用Add(message, type)名单上,有两种选择:

  • List<Log>创建派生新类:

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

    注意这是超载(添加一个新的方法签名但具有相同的名称,Add),而不是覆盖iding(对于现有的签名方法提供了新的行为对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方法 - 为什么你需要能够改变施工后的消息或类型?

+0

我去了Logger类。感谢您的建议! – kravits88

1

您可以创建自己的类从List派生并为您的需求的新Add方法,例如:

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

但是这并不是重写:( –

+0

@SriramSakthivel:考虑到它不是现有类的一部分,所以重写给定的方法是不可能的,OP只是混淆了重载和覆盖,这是一个相当常见的错误 –

+0

@ JonSkeet哦..我忽略了只是因为覆盖关键字:( –

0

除了保存一两次打字之外,它没有任何区别。话虽如此,你可以始终实现自己的列表类并使用它。或者你可以使用扩展方法。