【发布时间】:2014-04-21 08:26:51
【问题描述】:
我想要完成的是:
Logger 类应该将LogMedia 的集合声明为成员变量,并且只需要声明一个函数:void LogException( Exception ex )。在这个函数内部,你应该遍历所有LogMedia实例,并调用每个实例中定义的虚函数。
我无法理解的是如何实现一个遍历所有这些实例的循环。或者更确切地说,我如何创建这些实例?
记录器类
public class Logger
{
static List<LogMedia> m_loggers = new List<LogMedia>();
**//Should I create som instances here?**
public static void LogException(Exception ex)
{
foreach(var i in m_loggers)
{
i.LogMessage(ex.Message + Environment.NewLine);
}
}
}
}
LogMediaClass*:然后我要创建类 logmedia 和其他三个类,其中“每个派生类都应该在 LogMedia 类中覆盖这个函数。如何创建这三个的实例类,以便我可以遍历它们,如 Logger 中所示?*
public class LogMedia
{
public virtual void LogMessage(string Message) { } //virtual function that doesen't do anything
}
public class OutputWindowLogMedia : LogMedia
{
public override void LogMessage(string Message)
{
System.Diagnostics.Debug.WriteLine(Message);
}
}
class TextFileLogMedia : LogMedia
{
public override void LogMessage(string Message)
{
StreamWriter writer = new StreamWriter("C:\\Temp\\xxx\\xxxx.txt");
writer.WriteLine(Message + " the error occured at: ");
writer.Close();
}
}
class EmailLogMedia : LogMedia
{
public override void LogMessage(string Message)
{
const string senderID = "xxx@gmail.com"; // use sender's email id here..
const string toAddress = "xxx@some.com";
const string senderPassword = "xxxx"; // sender password here...
try
{
SmtpClient smtp = new SmtpClient
{
Host = "smtp.gmail.com", // smtp server address here...
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new System.Net.NetworkCredential(senderID, senderPassword),
Timeout = 30000,
};
MailMessage message = new MailMessage(senderID, toAddress, "erroe", "error");
smtp.Send(message);
}
catch (Exception ex)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Error sending mail:" + ex.Message);
Console.ResetColor();
}
}
}
【问题讨论】:
-
两个切线相关的注释:1)为什么不使用抽象类/方法而不是没有基本实现的虚拟方法? 2) 您应该将
StreamWriter包装在using语句中,以确保它被正确处理。 -
您是否正在寻找一种方法来以编程方式查找和实例化从 LogMedia 派生的所有类?
-
是的。我希望能够遍历覆盖/继承 Logmedia 类的所有类实例
标签: c# list class logging foreach