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

标签 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 的问题。那里,这意味着我没有从那一端获得自动完成功能,这也很丑陋。

提前致谢!

最佳答案

请问您要做什么?

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

所以你的控件就变成了 公共(public)部分类 DisplayItemsControl:System.Web.UI.UserControl { 公共(public)列表项;

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

并且,根据您上面的示例,界面将是

公共(public)接口(interface) IDisplayable { 字符串名称{get;}

关于c# - 在 UserControl 中使用泛型类型的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19671186/

相关文章:

c# - 创建一个类似 C# 和 XNA 'Monster Dash' 的游戏

.net - EnsureSuccessStatusCode 的使用以及它抛出的 HttpRequestException 的处理

c# - web api 2.0过滤器实现customFilter的最佳选择

c# - LinkBut​​ton OnCommand 或 OnClick 未触发

c# - Float epsilon 在 C++ 中不同于 C#

html - 仅带有 Image Css 的水平菜单

c# - 运行循环时内存不足异常

javascript - 使用 Javascript 循环访问 ASP.NET DataList

ASP.NET jQuery AutoComplete - 第一次搜索后文本框没有响应

c# - 将数组传递给 C# .Net 中特定索引的函数