【问题标题】:Selecting and building a Control from a control library dynamically, using the control name from a table使用表格中的控件名称从控件库中动态选择和构建控件
【发布时间】:2010-02-01 17:23:34
【问题描述】:

我的服务器控件库中有一个自定义 DDL。

目前我通过强输入控件的名称来将此控件添加到表格中,这是惯用的方式。

Control_Library.Report_NumberDDL newDDL = new Control_Library.Report_NumberDDL();

我想要做的是通过从表中提取控件名称来动态创建该控件。

所以我会在我的代码中使用控件的名称,在本例中为“Report_NumberDDL”,然后我想创建控件而不必强行键入它。

类似这样的东西,虽然我知道这不起作用:

string controlName = "Report_NumberDDL";

Control_Library."controlName" controlNum1 = new Control_Library."controlName"();

所以,既然这显然行不通,有人可以帮我解决什么问题吗?

谢谢

编辑:

我试图这样做:

    Type type = Type.GetType("Control_Library.Report_NumberDDL");
    object control = Activator.CreateInstance(type);

但是在 CreateInstance(type) 上我得到一个空值异常。所以没有正确创建类型。

【问题讨论】:

    标签: c# asp.net dynamic controls


    【解决方案1】:

    您需要使用反射来动态实例化对象。导入 System.Reflection 命名空间,然后执行以下操作:

    Type type = Type.GetType(ControlName); 
    object control = Activator.CreateInstance(type); 
    

    【讨论】:

    • 好的,我正在尝试解决这个问题,但这里有一个问题是我所做的:Type type = Type.GetType("One_Eva_Control_Library.Emu_AIR_Report_NumberDDL");对象控制 = Activator.CreateInstance(type);现在我得到一个 null 类型的异常,所以我不确定我在那里做错了什么。
    • 确保您的 One_Eva_Control_Library 程序集已加载且可用。然后试试 Type type = Type.GetType("Emu_AIR_Report_NumberDDL");
    • 当您说已加载且可用时,这是否仅仅意味着添加“使用 One_Eva_Control_Library;”到我的 aspx.cs 文件?或者是否还有其他需要确保程序集已加载且可用。
    • 我也发现了这个:blogs.msdn.com/haibo_luo/archive/2005/08/21/454213.aspx 如果你使用 typeof(One_Eva_Control_Library.Emu_AIR_Report_NumberDDL).AssemblyQualifiedName,你应该得到用于 GetType() 的字符串。
    • 我的意思是程序集在您的项目中被引用,并且您在类文件的顶部有一个 using 语句。我正在查看用于为插件系统加载类型的代码,并且我也使用 Assembly.LoadFile() 通过反射加载程序集。我认为获得 AssemblyQualifiedName 将是您最好的选择。
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2011-02-20
    • 1970-01-01
    相关资源
    最近更新 更多