我有一个ASPX自定义控件,它应该将它的属性加载到内部集合中(使用PersistenceMode.InnerProperty定义)。这是ASPX
<cc:CustomControl runat="server">
<Queries>
<cc:QueryTypeOne ... />
</Queries>
</cc:CustomControl>
问题是,当我使用上面的代码时,我得到一个解析器错误“Type'CustomControls.QueryCollection'没有名为'QueryTypeOne'的公共属性”。 (FYI QueryTypeOne继承了一个名为Query的类)。我不想要一个名为QueryTypeOne的公共属性,我希望它加载到我等待它的QueryCollection属性中!
以下是所有相关代码。
CustomControls.CustomControl类有一个名为queries
的属性<DefaultValue(CType(Nothing, String)),
MergableProperty(False),
PersistenceMode(PersistenceMode.InnerProperty)> _
Public Property Queries As QueriesContainerTag
QueriesContainerTag只是存在以允许ASPX引擎访问集合(QueryCollection)
<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
其中QueryCollection是一个使用此签名实现ICollection的自定义类:
Public Class QueryCollection
Implements IList(Of Query), ICollection(Of Query), IEnumerable(Of Query)
另外,奇怪的是,如果我将QueriesContainerTag更改为使用内置列表类,那么一切都很完美!
<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
答案 0 :(得分:2)
Microsoft 不为自定义控件集合属性实现Generic List支持!一旦我添加了IList
接口,一切都开始完全按预期工作。
就个人而言,我不明白为什么他们这样做。更重要的是,我认为IList(Of T)
(IList<T>
对你来说是C#伙伴们)应该在需要IList
的任何地方自动运行。毕竟,T 总是从对象继承。