gpt4 book ai didi

c# - 在业务应用程序中使用反射可能存在的弱点

转载 作者:行者123 更新时间:2023-11-30 15:49:00 26 4
gpt4 key购买 nike

尝试使用不同的方法并减少代码维护,我最终使用反射在我的 MDI 应用程序中创建新表单。

这个“解决方案”的原因是提供一个中心位置来设置新表单、实现安全检查和可能的 future 需求。

我目前有一个用 MDI 父窗体实例化的静态 Activator 类,每当我需要为应用程序创 build 置新窗体时,我都会调用我创建的方法:private static T CreateForm<T>(params args[]) where T: class .此方法使用 System.Activator 类来实例化给定的类。我还有其他静态方法,如 public static void ShowCustomers()实际上通过调用 CreateForm<frmCustomers>() 使用“反射”方法设置 MDI 父级等。

对象创建发生在 try/catch block 中,如果无法创建表单我会显示一条消息并说明原因。

到目前为止,我所解释的内容可能无法验证在业务应用程序中使用反射创建 MDI 表单的必要性,但我希望添加它在我的应用程序中的另一个用途。我有一个实现 ISupportInitialize 接口(interface)的组件,当我将其放到表单上时,它会执行安全检查并在 EndInit 方法中抛出 System.Security.SecurityException。 CreateForm 中包含此异常方法并向用户显示一条用户友好的消息。

此外,我正在考虑可能存储创建的表单的 MRU(最近使用的)列表以及比在 CreateForm 中更好地执行此操作的列表。方法。

我不熟悉代码气味、设计气味等术语,但我已经看到这些词经常被使用,但我的问题基本上可以归结为:

根据我提供的信息(希望可以理解),这种方法是否“不好”?

如果是这样,哪种方法更适合?

欢迎任何评论。

谢谢,斯特凡

public class Activator
{
private static Activator instance;

private MainForm mainForm;

private Activator(MainForm mainForm)
{
this.mainForm = mainForm;
}

private Activator()
{

}

private static Activator Instance
{
get
{
if (instance == null) throw new Exception("Not activated");
else return instance;
}
}

private static void ShowMDIChild<T>(params object[] args) where T : class
{
try
{
System.Windows.Forms.Form frm = Create<T>(args) as System.Windows.Forms.Form;
ShowMDIChild(frm);
}
catch (Exception e)
{
// Check if the inner exception is a security exception
bool isSecurity = false;
if (e.GetType().Equals(typeof(System.Security.SecurityException))) isSecurity = true;

if (!isSecurity && e.InnerException != null && e.InnerException.GetType().Equals(typeof(System.Security.SecurityException))) isSecurity = true;

if(isSecurity)
MessageBox.Show(Instance.mainForm, "You do not have the neccessary privileges to access this resource", "Access denied", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Stop);
else
MessageBox.Show(Instance.mainForm, e.Message, "An error has occurred", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
}
}

private static void ShowMDIChild(System.Windows.Forms.Form form)
{
Instance.mainForm.ShowMDIChild(form);
}

private static T Create<T>(params object[] args) where T: class
{
T result = System.Activator.CreateInstance(typeof(T), args) as T;

return result;
}

public static void Register(MainForm mainForm)
{
instance = new Activator(mainForm);
}

public static void Customers()
{
ShowMDIChild<Forms.Customers>();
}
}

最佳答案

您为自己构建了一个框架。它解决了您的问题,并且正如您所说,它减少了代码维护。如果您对代码感到满意,那么您就完成了。

记录它是个好主意,以防万一您得到/雇用更多的开发人员来处理这个项目。

关于c# - 在业务应用程序中使用反射可能存在的弱点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143107/

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