在UserControl中使用泛型类型的正确方法是什么?

时间:2013-10-29 23:38:00

标签: c# asp.net .net generics

首先,也许有人可以帮助更好地命名问题。

我正在努力完成的事情:

下面是我想要实现的非常简单示例,只使用基本工作部件就可以得到我正在寻找的解决方案。

我希望能够在.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的问题,这意味着我没有从那一端得到自动完成,这也很难看。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我可以问你要做什么吗?

如果要显示许多不同类型的项目,更好的策略是使用IDisplayable这样的界面列出显示项目所需的属性。现在任何项目都可以放在界面上并且能够被控件使用,并且控件不必担心知道如何从许多不同的对象中挖掘出显示信息。

所以你的控制就变成了 public partial class DisplayItemsControl:System.Web.UI.UserControl {     公共列表项目;

public void Add(IDisplayable item) {
    Items.Add(item);
}

}

而且,根据上面的例子,界面只是

公共接口IDisplayable {     string Name {get;} }