我有一个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
答案 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编译器如何工作的情况下,这不会发生。
解决方法:
string
的公共属性
使用GetType(string)重载在代码中获取此类型的实例。
&LT; prfx:fooCtrl ID = “theId” RUNAT = “服务器” Bar =“System.String,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”/&gt;
,代码:
/* ... */
var barType = Type.GetType(this.Bar);
// do whatever you want with this type