Asp.net 具有自定义集合属性的自定义控件

Asp.net 具有自定义集合属性的自定义控件,asp.net,vb.net,custom-controls,Asp.net,Vb.net,Custom Controls,我有一个ASPX自定义控件,它应该将其属性加载到内部集合中(用PersistenceMode.InnerProperty定义)。这是ASPX <cc:CustomControl runat="server"> <Queries> <cc:QueryTypeOne ... /> </Queries> </cc:CustomControl> 而且,奇怪的是,如果我将QueriesContainerTag更改

我有一个ASPX自定义控件,它应该将其属性加载到内部集合中(用PersistenceMode.InnerProperty定义)。这是ASPX

<cc:CustomControl runat="server">
    <Queries>
        <cc:QueryTypeOne ... />
    </Queries>
</cc:CustomControl>
而且,奇怪的是,如果我将QueriesContainerTag更改为使用内置的list类,那么一切都可以完美地工作

<ParseChildren(True, "Queries"),
 Serializable()> _
Public Class QueriesContainerTag
    Private _Queries As List(Of Query) = Nothing
    Public ReadOnly Property Queries As List(Of Query)
        Get
            If _Queries Is Nothing Then
                _Queries = New List(Of Query)()
            End If

            Return _Queries
        End Get
    End Property
End Class
_
公共类QueriesContainerTag
Private _查询作为(查询的)列表)=无
公共只读属性查询作为(查询的)列表
得到
如果什么都不是,那么
_查询=新列表(查询)()
如果结束
返回查询
结束
端属性
末级

Microsoft没有对自定义控件集合属性实施通用列表支持!当我添加了
IList
接口后,一切都开始正常工作


就我个人而言,我不明白他们为什么这么做。更重要的是,我认为无论何时需要
IList
IList
,对于你们这些C#家伙来说)都应该自动运行
IList
。毕竟,T将始终从object继承。

您是否尝试将Queries属性和QueryCollection权限放在自定义控件中,并查看是否效果更好?将语句也移到那里。事实证明,出于我无法理解的原因,Microsoft没有为自定义控件集合属性实现通用列表支持!我一添加IList接口,一切就完全按照预期开始工作。就我个人而言,我不明白他们为什么这么做。更重要的是,我认为IList(Of T)(IList for you C#guys)应该在需要IList的任何地方自动工作。毕竟,T将始终从对象继承。我想这就是生活。这节省了我很多时间。谢谢我用这个把头撞到了墙上。最后,我创建了一个从集合继承的自定义集合。集合类已经实现了IList,因此现在控件可以正常工作。
<ParseChildren(True, "Queries"),
 Serializable()> _
Public Class QueriesContainerTag
    Private _Queries As QueryCollection = Nothing
    Public ReadOnly Property Queries As QueryCollection
        Get
            If _Queries Is Nothing Then
                _Queries = New QueryCollection()
            End If

            Return _Queries
        End Get
    End Property
End Class
Public Class QueryCollection
    Implements IList(Of Query), ICollection(Of Query), IEnumerable(Of Query)
<ParseChildren(True, "Queries"),
 Serializable()> _
Public Class QueriesContainerTag
    Private _Queries As List(Of Query) = Nothing
    Public ReadOnly Property Queries As List(Of Query)
        Get
            If _Queries Is Nothing Then
                _Queries = New List(Of Query)()
            End If

            Return _Queries
        End Get
    End Property
End Class