【发布时间】:2013-11-09 08:57:36
【问题描述】:
对于初学者,也许有人可以帮助更好地命名问题。
我正在努力实现的目标:
下面是一个非常简单示例,说明我正在尝试实现的目标,仅使用基本的工作部分就能够得出我正在寻找的解决方案。
我希望能够在 .ascx.cs 代码隐藏中创建以下文件:
public partial class DynamicControl<T> : System.Web.UI.UserControl where T : class
{
public List<T> Items;
public void Add(T item) {
Items.Add(item);
}
}
在 .ascx 文件中正确引用它:
<% foreach (var item in Items) { %>
<p>item.Name</p>
<% } %>
并将其加载到一个带有如下标签的 .aspx 文件中:
<custom:DynamicControl ID="DynamicControl1" ItemType="Person" runat="server" />
甚至在 .aspx.cs 代码隐藏中为:
DynamicControl1.ItemType = Type.GetType("Person");
真的,一切皆有可能。
我只需要一种在我的网站上创建通用用户控件的方法,我可以在其中以编程方式(或在标签中)设置项目类型并使用 .ascx.cs 和 .ascx 文件以及引用.aspx 文件。
我的尝试:
1) 创建DynamicControlBuilder 并继承ControlBuilder 类,然后使用[ControlBuilder(typeof(DynamicControlBuilder))] 将其作为属性附加。结果是,控件没有将泛型类型添加到 .aspx.designer.cs 文件中,因此 .ascx 文件也不知道如何呈现。
2) 创建使用泛型类型的DynamicControl 类的内部属性,只是我找不到像DynamicControl<dynamic> 这样的默认成员或类似的东西的好的解决方案——因为显然那时对象将不兼容,我不会得到任何自动完成或编译时错误处理。
3) 使用类似Add<T>(T item) where T : class 的方法,例如,这就是我现在正在做的事情......但是如果我想向单个控件添加大量项目,这会变得很难看.我不希望开发人员每次都必须为每个方法重新声明类型。它也没有解决那里有List<T> Items 的问题,这意味着我没有自动完成,这也很丑陋。
提前谢谢你!
【问题讨论】:
-
为什么要标记 WPF?
-
我想不出一个更适合 UserControl 的标签,我相信它们通常与 WPF 相关联。如果它不是问题的最佳标签,我很乐意将其删除。
-
如果你定义了
DynamicFooControl : DynamicControl<Foo> {}、DynamicBarControl : DynamicControl<Bar> {}等类型呢?