gpt4 book ai didi

c# - 在列表中创建类实例

转载 作者:行者123 更新时间:2023-11-30 17:00:16 25 4
gpt4 key购买 nike

我想要完成的是:

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();
}

}
}

最佳答案

请在静态构造函数中初始化。

在其中添加所有记录器。确保无论何时调用 LogException() 都会填​​充列表,因为该函数是静态的。

也只是一个侧面的想法,将基础 LogMedia 做成抽象或者最好是一个接口(interface)

现在这也有一个副作用,每当将来某个时候添加一个新的 LogMedia 时,必须在静态构造函数中添加一个 Add 调用。

这可能会在维护的大项目中引起错误,因此为了避免这种情况,在静态构造函数中添加一个 InitializeAllLoggers() 方法,并将以下代码放入其中。

foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies().ToList())
{
foreach (Type classType in assembly.GetTypes())
{
if (classType.IsClass
&& !classType.IsAbstract
&& classType.IsSubclassOf(typeof(LogMedia)))
{
m_loggers.Add(Activator.CreateInstance(classType) as LogMedia);
}
}
}

这将确保无论何时创建新类型的 LogMedia,它都会自动添加到记录器列表中。

关于c# - 在列表中创建类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432236/

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