通用(即<t>)Web用户控件的语法</t>

时间:2013-05-01 10:28:04

标签: c# asp.net generics .net-3.5

假设我已经制作了如下网页控件:

public class TestControl<T> : WebControl
{
    ...
}

有没有办法将该控件放在.aspx页面而不必通过代码执行?我真的希望能够做到这样的事情:

<controls:TestControl<int> runat="server" />

但据我所知,我无法传递泛型参数。我已经尝试在网上搜索并找到了这个http://forums.asp.net/t/1309629.aspx,这似乎正是我所追求的,但似乎没有人能理解这个人想要的东西,而且我在StackOverflow上找不到类似的东西。

3 个答案:

答案 0 :(得分:5)

没有。没有办法做到这一点。

答案 1 :(得分:4)

不。您最好的选择可能是将其作为基础,并从中获取更多直接控制,例如TestIntControlTestStringControl等等。我知道这违背了纯通用主义的目的,但你没有其他选择。然后,您可以在需要显式标记的位置使用这些类型,并且在更动态的页面中仍然具有基础类型的灵活性。

答案 2 :(得分:0)

您可以将泛型类型设为abstract,并继承可以随后放置在页面上的具体类型。一方面,这是更多的代码,但它也允许您通过调用基础构造函数来自定义类型。

public abstract class MyGenericControl<T> : WebControl {
   ...

   public T SomeStronglyTypedProperty { get; set; }

   protected MyGenericControl(...) {
      ...
   }

   ...
}

public sealed class MyConcreteControl : MyGenericControl<SomeType> {
   public MyConcreteControl()
   : base(
      ...
   ) {
   }
}

在您的标记中:

<%@ Page ... %>
<%@ Register assembly="MyAssembly" namespace="MyNamespace" tagPrefix="abc" %>
<asp:Content ...>
   <abc:MyConcreteControl id="myConcreteControl" runat="server" />
</asp:Content>

然后在你的代码中:

...
SomeType value = GetAValue();
myConcreteControl.SomeStronglyTypedProperty = value;
...