为何无法像Dictionary那样嵌套初始化自定义集合类?
解决方案
要让IDOPropertyList支持像Dictionary(Of String, String)那样的双参数集合初始化,你需要在IDOPropertyList类中添加一个接收两个字符串参数的Add方法重载。
核心原因
VB.NET的集合初始化器语法规则是:当使用From { {参数1, 参数2} }格式时,编译器会自动查找集合类中匹配参数数量、类型的Add方法,自动调用该方法完成元素添加。Dictionary能直接用键值对初始化,正是因为它提供了Add(key As String, value As String)的重载方法。
修改后的代码
更新IDOPropertyList类,新增对应Add重载:
Public Class IDOPropertyList Private ReadOnly Property _IDOProperties As New List(Of IDOProperty) Public Function GetEnumerator() As IEnumerator(Of IDOProperty) Return _IDOProperties.GetEnumerator End Function ' 原有添加IDOProperty实例的方法 Public Sub Add(IDOProperty As IDOProperty) _IDOProperties.Add(IDOProperty) End Sub ' 新增双参数Add方法,适配集合初始化语法 Public Sub Add(name As String, value As String) Dim prop As New IDOProperty() prop.Add(name) prop.Add(value) _IDOProperties.Add(prop) End Sub End Class
验证目标初始化语法
现在你可以直接使用预期的代码初始化IDOPropertyList:
Dim Test3 = New IDOPropertyList From { {"MyKey1", "MyValue1"}, {"MyKey2", "MyValue2"} }
可选优化
为了简化IDOProperty的创建逻辑,你可以给它添加带参数的构造函数:
Public Class IDOProperty Private ReadOnly Property _parts As New List(Of String) Public ReadOnly Property Name As String Get Return _parts(0) End Get End Property Public ReadOnly Property Value As String Get Return _parts(1) End Get End Property Public Function GetEnumerator() As IEnumerator(Of String) Return _parts.GetEnumerator End Function Public Sub Add(part As String) _parts.Add(part) End Sub ' 新增构造函数,直接初始化Name和Value Public Sub New(name As String, value As String) _parts.Add(name) _parts.Add(value) End Sub End Class
此时IDOPropertyList的Add方法可以简化为:
Public Sub Add(name As String, value As String) _IDOProperties.Add(New IDOProperty(name, value)) End Sub
内容的提问来源于stack exchange,提问作者Kelderic
相关产品推荐
相关产品推荐

