假设我已经制作了如下网页控件:
public class TestControl<T> : WebControl
{
...
}
有没有办法将该控件放在.aspx页面而不必通过代码执行?我真的希望能够做到这样的事情:
<controls:TestControl<int> runat="server" />
但据我所知,我无法传递泛型参数。我已经尝试在网上搜索并找到了这个http://forums.asp.net/t/1309629.aspx,这似乎正是我所追求的,但似乎没有人能理解这个人想要的东西,而且我在StackOverflow上找不到类似的东西。
答案 0 :(得分:5)
没有。没有办法做到这一点。
答案 1 :(得分:4)
不。您最好的选择可能是将其作为基础,并从中获取更多直接控制,例如TestIntControl
,TestStringControl
等等。我知道这违背了纯通用主义的目的,但你没有其他选择。然后,您可以在需要显式标记的位置使用这些类型,并且在更动态的页面中仍然具有基础类型的灵活性。
答案 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;
...