如何将Type传递给UserControl

时间:2010-02-19 14:11:05

标签: c# asp.net visual-studio intellisense

我有一个UserControl(比方说Foo.ascx),它有一个名为Bar的Type公共属性。 我正在寻找一种方法,当我在标记部分的源视图中声明此usercontrol以传递类型。例如

<%@ Register Src="~/Controls/Foo.ascx" TagPrefix="prfx" TagName="fooCtrl" %>

然后将其用作

<prfx:fooCtrl ID="theId" runat="server" />

如果例如我想传递给控件的字符串类型(例如typeof(string)) 会产生这种影响的东西

<prfx:fooCtrl ID="theId" runat="server" Bar="typeof(string)" />

怎么办? 在有人问之前,原因是我在这个用户控件中有很多其他属性,我以这种方式传递,我想避免使用CodeBehind传递Type

2 个答案:

答案 0 :(得分:2)

您可以将类型为string的属性添加到用户控件中,例如TypeName:

public string TypeName { get; set; } // Validation omitted for brevity

然后将Bar属性的实现更改为:

public Type Bar { get { return Type.GetType(TypeName); } }

你可以这样写:

<prfx:fooCtrl ID="theId" runat="server" Bar="System.String" />

让所有需要使用该类型的代码调用Bar属性。

答案 1 :(得分:1)

简短的回答,你不能这样做。编辑器和编译器将.ascx文件视为(最终)XML。这意味着在“反序列化”属性可以转换为各种基本类型,但不能转换为复杂类型,如System.Type。为了工作,在编译期间的某些时候,您想要做的是,xml文档中的属性不被视为文本,不会转换为简单类型,而是作为代码进行解释和执行。在不改变Visual Studio和ASP.NET编译器如何工作的情况下,这不会发生。


解决方法:

  1. 在UserControl
  2. 中创建类型为string的公共属性
  3. 通过此属性
  4. 将您要传递的类型的AssemblyQualifiedName传递给UserControl
  5. 使用GetType(string)重载在代码中获取此类型的实例。

    &LT; prfx:fooCtrl     ID = “theId”     RUNAT = “服务器”     Bar =“System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”/&gt;

  6. ,代码:

    /* ... */
    var barType = Type.GetType(this.Bar);
    // do whatever you want with this type