.net 为什么在使用.Add时未访问setter?
我试图在修改集合时设置一个标志——这样做的逻辑位置似乎在setter方法中。问题是当我使用这个代码时.net 为什么在使用.Add时未访问setter?,.net,vb.net,.net,Vb.net,我试图在修改集合时设置一个标志——这样做的逻辑位置似乎在setter方法中。问题是当我使用这个代码时 setterDemo1.Widgets.Add(new Widget) m_widgetSetterVisited未设置为True。 有人看到我遗漏了什么吗? 谢谢 戴夫 当设置列表(小部件)本身时,您的代码仅更改m_widgetSetterVisited标志-而不是在访问其成员时。所以您需要这样的代码来触发它: setterDemo.Widgets = New List(Of Widget)
setterDemo1.Widgets.Add(new Widget)
m_widgetSetterVisited未设置为True。
有人看到我遗漏了什么吗?
谢谢
戴夫
当设置
列表(小部件)
本身时,您的代码仅更改m_widgetSetterVisited
标志-而不是在访问其成员时。所以您需要这样的代码来触发它:
setterDemo.Widgets = New List(Of Widget)
或
简单地操作该引用的成员是不起作用的。在设置
列表(小部件)
本身时,您的代码只会更改m\u widgetSetterVisited
标志,而不是在访问其成员时。所以您需要这样的代码来触发它:
setterDemo.Widgets = New List(Of Widget)
或
简单地操作该引用的成员将不起作用。在示例代码中,您正在对字段执行一个
get
,然后对返回的List
类型的对象调用一个方法。请注意,您从未设置字段m\u Widgets
的值。简言之,这是行不通的
我认为要完成您想要做的事情,您需要从System.Collections.ObjectModel
命名空间(或List
如果不可能)中的类继承并重写添加和删除成员的各种方法,或者封装List
并自己实现IList
,根据需要发送到内部列表。或者,您可以使用在添加/删除对象时触发事件的
编辑-输入Gideon的注释以使用
System.ObjectModel.Collection
如果可能在示例代码中,您正在对字段执行get
,然后对返回的List
类型的对象调用方法。请注意,您从未设置字段m\u Widgets
的值。简言之,这是行不通的
我认为要完成您想要做的事情,您需要从System.Collections.ObjectModel
命名空间(或List
如果不可能)中的类继承并重写添加和删除成员的各种方法,或者封装List
并自己实现IList
,根据需要发送到内部列表。或者,您可以使用在添加/删除对象时触发事件的
编辑-输入Gideon的注释以使用
System.ObjectModel.Collection
(如果可能)我们处理此问题的方法是让所有集合继承自或
这些集合具有被设计为重写的方法(InsertItem、RemoveItem、ClearItems和SetItem),每当对集合中的项进行更改时,这些方法都将被激发
您可以重写这些方法中的每一个,并根据需要设置您的标志。我们处理这一问题的方法是让所有集合从或继承 这些集合具有被设计为重写的方法(InsertItem、RemoveItem、ClearItems和SetItem),每当对集合中的项进行更改时,这些方法都将被激发
您可以覆盖这些方法中的每一种,并根据需要设置您的标志。您可以使用支持
IList
界面并支持集合更改通知的ObservableCollection
:
Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Public Class ChangedDemo
Private m_Widgets As ObservableCollection(Of Widget) = New ObservableCollection(Of Widget)
Public m_WidgetsChanged As Boolean = False
Public Sub New()
AddHandler m_Widgets.CollectionChanged, AddressOf m_Widgets_CollectionChanged
End Sub
Private Sub m_Widgets_CollectionChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs)
m_WidgetsChanged = True
End Sub
Public ReadOnly Property Widgets() As IList(Of Widget)
Get
Return m_Widgets
End Get
End Property
End Class
您可以使用支持
IList
界面的ObservableCollection
,还支持收集更改通知:
Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Public Class ChangedDemo
Private m_Widgets As ObservableCollection(Of Widget) = New ObservableCollection(Of Widget)
Public m_WidgetsChanged As Boolean = False
Public Sub New()
AddHandler m_Widgets.CollectionChanged, AddressOf m_Widgets_CollectionChanged
End Sub
Private Sub m_Widgets_CollectionChanged(ByVal sender As Object, ByVal e As NotifyCollectionChangedEventArgs)
m_WidgetsChanged = True
End Sub
Public ReadOnly Property Widgets() As IList(Of Widget)
Get
Return m_Widgets
End Get
End Property
End Class
我有兴趣回应那些认为这个答案没有帮助的人的想法我有兴趣回应那些认为这个答案没有帮助的人的想法非常感谢,我将看到所有这些优秀的答案。我本以为会调用setter,因为通过添加一个新成员,我正在更改.Widgets的值,因此正在向其写入。
List
不是首选的基类(尽管可能存在需要这种方法的外部问题)。在进行集合时,您应该从System.ObjectModel.Collection
派生。非常感谢我将看到所有这些优秀的答案。我本以为会调用setter,因为通过添加一个新成员,我正在更改.Widgets的值,因此正在向其写入。List
不是首选的基类(尽管可能存在需要这种方法的外部问题)。创建集合时,应该从System.ObjectModel.Collection
派生。