2010-03-02 85 views
1

我有一个ASP.NET 3.5中的网页,它将动态创建WebControl。它将要创建的WebControls将以其完全限定的路径(即 - System.Web.UI.WebControls.whatever)而为人所知。原因是因为我允许用户决定网页上的控件。当然,比这更复杂,但简而言之就是这样。从完全限定的路径创建WebControls(程序集名称?)

简单地说 - 我如何通过完全合格的路径在网页上创建WebControl?

我意识到,答案可能会最终使用反射,但我没有使用反射的经验,我不想通过犯新手错误在自己的脚下拍摄自己。

+0

是在编译时已知的所有可能的类型?这会给你更多的选择。反射是绝对有可能的,但如果你必须在每个webcontrol上设置很多单独的属性,它可能最终成为一个麻烦。 – 2010-03-02 18:38:36

+0

你说得很好,而且我知道如果我朝这个方向行事,我必须在某个时候处理这​​个问题。真相被告知,我仍然不相信我会追求这条道路,因为正如你所说的,我将在网络控制上访问许多属性,我不确定在尝试添加多少复杂性时访问它们。 – Jagd 2010-03-02 19:32:53

回答

3

尝试的字符串来调用这个方法:Activator.CreateInstance(Type.GetType("TypeName"));

其中typeName为完全合格的名称,包括装配。在我的情况下,它看起来是这样的:

Activator.CreateInstance(Type.GetType("System.Web.UI.WebControls.Label, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")); 

,以确保有关全名的情况下,尝试输出typeof(System.Web.UI.WebControls.Label).FullName,并用它作为图案

+0

唯一要记住的是'Activator'只适用于公共类实现一个默认的构造函数,即一个无参数的构造函数。 – 2010-03-02 18:31:14

+0

我不同意。如果你设法从Assembly对象中挖出Type对象,它可以实例化私有类。关于无参数构造函数也是不正确的,你可以将参数传递给构造函数作为第二个参数给CreateInstance – Andrey 2010-03-02 18:37:51

+0

这是有效的。谢谢! – Jagd 2010-03-02 19:05:39

1
object widget = Activator.CreateInstance (Assembly.GetType (name)); 

其中名称是完全合格的类型

+0

唯一要记住的是'Activator'只适用于实现默认构造函数的公共类,也就是无参数构造函数。 – 2010-03-02 18:30:42

+0

我觉得这很接近,但还没有那么完美。 Assembly没有GetType()的静态方法,但是Assembly的一个实例当然是。 – Jagd 2010-03-02 18:57:37

+0

您还可以通过typeof(x)来获取Activator.CreateInstance所需的类型。然后x等于System.Web.UI.WebControls.Label,System.Web.UI.WebControls.Textbox或任何其他想要动态创建的类型 – JDMX 2010-03-02 19:01:28

相关问题