gpt4 book ai didi

c# - 在运行时从数据库名称 C# 实例化 Windows 窗体

转载 作者:太空宇宙 更新时间:2023-11-03 11:09:46 25 4
gpt4 key购买 nike

我在用 c# 实例化一个表单时遇到了问题,我从数据库中检索了它的名称,我已经完全消除了 namespace ,只是为了确保我没有弄错对象名称,但每次代码运行时,对象都返回 null而不是适当的形式。

private static Object CreateObjectInstance(string strObjectName)
{
Object obj = null; // Temporary object

try
{
if (strObjectName.LastIndexOf(".") == -1) // If there is no '.' in the object name
strObjectName = Assembly.GetEntryAssembly().GetName().Name + "." + strObjectName;

obj = Assembly.GetEntryAssembly().CreateInstance(strObjectName);
}
catch (Exception ex)
{
clsAdmFunctions.RecordException(ex); // Record error to the database
MessageBox.Show("Error instantiating the object\n\nDescription : "+ex.Message, "Object Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
obj = null;
}

return obj;
}

public static Form CreateForm(string strFormName)
{
return (Form)CreateObjectInstance(strFormName);
}

最佳答案

问题在于您认为程序集名称是类名的一部分。的确,您需要访问程序集,但最终类名只是 Namespace.Class 名称。如果您在提供类的同时提供实际的 namespace ,那么它就可以工作。将您的方法更改为此,也许:

private static T CreateInstance<T>(string fullyQualifiedClassName)
{
try
{
return (T)Activator.CreateInstance(Type.GetType(fullyQualifiedClassName));
}
catch (Exception ex)
{
clsAdmFunctions.RecordException(ex); // Record error to the database
MessageBox.Show("Error instantiating the object\n\nDescription : " + ex.Message, "Object Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
return default(T);
}
}

换句话说,如果您要将命名空间保存在数据库中,您也需要命名空间。只需保存 class.GetType()class.GetType().ToString() ,之后您将看到命名空间也已保存。原因是您可以在同一个程序集中具有相同名称的类,namespace1.Personnamespace2.Person

如果需要读取一个程序集中的所有命名空间,可以这样做:

 foreach(var type in Assembly.WhateverAssembly().GetTypes())
//print type.Namespace;

如果您不知道确切的命名空间,您就会陷入困境。也许你可以假设它是

var namespace = Assembly.WhateverAssembly().GetTypes()[0].Namespace;

您的类需要有命名空间,否则违反 .NET 的设计。如果你真的真的不想为你的表单命名空间,你只需要指定类名,排除程序集名称。只需调用:

CreateInstance<MyForm>("MyForm"); 

假设 MyFormglobal 并且程序集是一样的。如果表单位于不同的程序集中,则首先使用 Assembly.LoadAssembly.LoadFrom 加载它,然后创建实例。

关于c# - 在运行时从数据库名称 C# 实例化 Windows 窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14502769/

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