Asp.net 从完全限定路径(程序集名称?)创建网络控件

Asp.net 从完全限定路径(程序集名称?)创建网络控件,asp.net,reflection,fully-qualified-naming,Asp.net,Reflection,Fully Qualified Naming,我在ASP.NET 3.5中有一个网页,将动态创建网络控件。它将创建的WebControl将通过其完全限定的路径(ie-System.Web.UI.WebControls.whatever)知道。这样做的原因是因为我允许用户决定网页上的控件。当然,还有比这更复杂的事情,但简而言之就是这样 简单地说-如何通过网页的完全限定路径在网页上创建网络控件? 我意识到答案可能最终会使用反射,但我没有使用反射的经验,我不想因为犯了一个新手错误而伤到自己的脚 object widget = Activator.

我在ASP.NET 3.5中有一个网页,将动态创建网络控件。它将创建的WebControl将通过其完全限定的路径(ie-System.Web.UI.WebControls.whatever)知道。这样做的原因是因为我允许用户决定网页上的控件。当然,还有比这更复杂的事情,但简而言之就是这样

简单地说-如何通过网页的完全限定路径在网页上创建网络控件?

我意识到答案可能最终会使用反射,但我没有使用反射的经验,我不想因为犯了一个新手错误而伤到自己的脚

object widget = Activator.CreateInstance ( Assembly.GetType ( name ) );
其中name是完全限定类型的字符串


其中name是完全限定类型的字符串

尝试这样调用:
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
并将其用作模式尝试以下方式调用:
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
并将其用作模式

唯一需要记住的是
Activator
仅适用于实现默认构造函数的公共类,即无参数构造函数。我认为这很接近,但还不完全是这样。Assembly没有GetType()的静态方法,但是Assembly的实例当然有。您还可以执行typeof(x)以获取Activator.CreateInstance所需的类型。然后x等于System.Web.UI.WebControls.Label、System.Web.UI.WebControls.Textbox或任何其他要动态创建的类型唯一要记住的是
Activator
仅适用于实现默认构造函数的公共类,即无参数构造函数。我认为这很接近,但还不是很接近。Assembly没有GetType()的静态方法,但是Assembly的实例当然有。您还可以执行typeof(x)以获取Activator.CreateInstance所需的类型。然后x等于System.Web.UI.WebControls.Label、System.Web.UI.WebControls.Textbox或任何其他要动态创建的类型唯一要记住的是,
Activator
仅适用于实现默认构造函数的公共类,即无参数构造函数。我不同意。若您设法从程序集对象中挖掘出类型对象,它可以实例化私有类。关于无参数构造函数也不是真的,您可以将参数作为CreateInstance的第二个参数传递给构造函数唯一需要记住的是,
Activator
仅适用于实现默认构造函数的公共类,即无参数构造函数。我不同意。若您设法从程序集对象中挖掘出类型对象,它可以实例化私有类。关于无参数构造函数也不是真的,您可以将参数作为CreateInstance的第二个参数传递给构造函数在编译时已知的所有可能类型?这会给你更多的选择。反射当然是可能的,但如果你必须在每个网络控件上设置许多单独的属性,那么它可能会成为一个麻烦。你提出了一个很好的观点,我知道如果我朝这个方向走,我会在某个时候解决这个问题。说实话,我仍然不相信我会走这条路,因为,正如你所说的,我将在网络控件上访问许多属性,我不确定尝试访问它们会增加多少复杂性。所有可能的类型在编译时都已知吗?这会给你更多的选择。反射当然是可能的,但如果你必须在每个网络控件上设置许多单独的属性,那么它可能会成为一个麻烦。你提出了一个很好的观点,我知道如果我朝这个方向走,我会在某个时候解决这个问题。说实话,我仍然不相信我会走这条路,因为正如你所说的,我将在网络控件上访问许多属性,我不确定尝试访问它们会增加多少复杂性。