2013-10-29 53 views
4

对于初学者来说,也许有人可以帮助更好地指出问题。在UserControl中使用泛型类型的正确方法是什么?

我正在试图完成:

下面是我想要实现的,只使用基本的工作部件,能够导出解决方案我一个非常简单的例子寻找。

我希望能够建立在.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>或类似的东西沿着这些行的东西 - 因为显然对象wouldn'在这一点上兼容,我不会得到任何自动完成或编译时错误处理。 3)使用类似于Add<T>(T item) where T : class的方法,例如,目前我正在做的是...但是如果我想将大量项目添加到单个控件,这只会变得很难看。我不希望开发人员每次都必须重新声明每种方法的类型。它也不能解决那里存在的问题,这意味着我从那里得不到任何自动完成,这也是丑陋的。

预先感谢您!

+0

这是为什么标签WPF ? –

+0

我想不出一个更合适的UserControl标签,我相信它们通常与WPF相关联。如果它不是问题的最佳标记,我很乐意将其删除。 – bdrelling

+0

如果你定义类型如'DynamicFooControl:DynamicControl {}','DynamicBarControl:DynamicControl {}'等等,该怎么办? – supercat

回答

0

我可以问你想做什么吗?

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

所以你的控制只是成为 公共分类DisplayItemsControl:System.Web.UI.UserControl { public List Items;

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

}

而且,鉴于你上面的例子,该接口也只是

公共接口IDisplayable { 字符串名称{;} }

+0

所以我明白如何使用接口并将它们添加到列表中以实现此结果,但是我遇到的困难是特别尝试创建一个UserControl,它可以模仿ASP Repeater可以使用ItemType属性执行的操作。 – bdrelling

+0

不太熟悉,但是,为什么呢?您可以使用反射和ItemName属性动态发现给定项目的属性值。但是它会很慢,并且没有多大意义,因为UI程序员现在需要知道他们要使用的任何对象的内部。 ASP做类似的事情 - 它创建一个RepeaterItem外观,并根据源项目的属性值填充Name变量。 – Mathieson

相关问题