5

假设我已经制作了一个 Web 控件,如下所示:

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

有没有办法将该控件放置在 .aspx 页面上而无需通过代码进行操作?我真的希望能够做类似的事情:

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

但据我所知,我无法传递通用参数。我尝试在网上搜索并找到了这个http://forums.asp.net/t/1309629.aspx,这似乎正是我所追求的,但似乎没有人明白这家伙想要什么,并且我在 StackOverflow 上找不到类似的东西。

4

3 回答 3

5

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

于 2013-05-01T10:29:25.447 回答
4

没有。您最好的选择可能是将其用作基础并从中获得更直接的控制,例如 a TestIntControl、 aTestStringControl等等。我知道这违背了纯泛型的目的,但是您几乎没有其他选择。然后,您可以在需要显式标记的地方使用这些类型,并且在更动态的页面中仍然具有底层类型的灵活性。

于 2013-05-01T10:31:31.780 回答
0

您可以将泛型类型抽象化,然后继承一个具体类型,然后您可以将其放置在页面上。一方面,这是更多的代码,但它也允许您通过调用基本构造函数来自定义类型。

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;
...
于 2015-03-06T18:12:05.097 回答