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

Posted

技术标签:

【中文标题】在 UserControl 中使用泛型类型的正确方法是啥?【英文标题】:What is the proper way for using generic types within a UserControl?在 UserControl 中使用泛型类型的正确方法是什么? 【发布时间】: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&lt;dynamic&gt; 这样的默认成员或类似的东西的好的解决方案——因为显然那时对象将不兼容,我不会得到任何自动完成或编译时错误处理。

3) 使用类似Add&lt;T&gt;(T item) where T : class 的方法,例如,这就是我现在正在做的事情......但是如果我想向单个控件添加大量项目,这会变得很难看.我不希望开发人员每次都必须为每个方法重新声明类型。它也没有解决那里有List&lt;T&gt; Items 的问题,这意味着我没有自动完成,这也很丑陋。

提前谢谢你!

【问题讨论】:

为什么要标记 WPF? 我想不出一个更适合 UserControl 的标签,我相信它们通常与 WPF 相关联。如果它不是问题的最佳标签,我很乐意将其删除。 如果你定义了DynamicFooControl : DynamicControl&lt;Foo&gt; DynamicBarControl : DynamicControl&lt;Bar&gt; 等类型呢? 【参考方案1】:

我能问一下你想做什么吗?

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

所以你的控制权就变成了 公共部分类 DisplayItemsControl:System.Web.UI.UserControl 公共列表项;

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

而且,鉴于上面的示例,界面将是

公共接口 IDisplayable 字符串名称get;

【讨论】:

所以我了解如何使用接口并将它们添加到列表中以实现此结果,但我遇到的困难是专门尝试创建一个模仿 ASP 中继器可以使用的 UserControl ItemType 属性。 不那么熟悉,但是,为什么?您可以使用反射和 ItemName 属性来动态发现任何给定项目的属性值。但是它会很慢,并且没有多大意义,因为 UI 程序员现在需要知道他们将要使用的任何对象的内部结构。 ASP 做了类似的事情 - 它创建一个 RepeaterItem 外观,并根据源项的属性值填充 Name 变量。

以上是关于在 UserControl 中使用泛型类型的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

涉及泛型对象的泛型属性的赋值无法在泛型函数中正确进行类型检查

枚举类型的 UserControl 属性在设计器中显示为 bool 或根本不显示

如何在 Typescript 中正确使用 React.lazy() 来导入带有泛型类型参数的反应组件?

为啥 TS 中的泛型接口不能正确推断类型?

使用正确的泛型类型迭代对象

Java 基础| 使用泛型的正确姿势