VB.NET在一个类中处理另一个类中的事件,而它们彼此不知道。。。?
我有一份申请 模块1-主要应用程序 DataAccessMananger—主应用程序中用于处理数据的类 配置-处理配置设置的不同项目(公共dll)中的类 这个问题。配置类如何处理DataAccessManager中的数据更改事件,而不知道DataAccessManager是什么,因为它们位于不同的类中 我能想到的唯一方法是让模块1处理来自DataAccessManager的事件,并让它在配置类中调用一个方法,但是我不喜欢这样,我希望配置能够处理它自己的数据更新 清澈如泥?有什么想法吗?VB.NET 4.5,我知道一些关于代理的知识,但不确定如何在这里使用它们,它们一定是一些如何VB.NET在一个类中处理另一个类中的事件,而它们彼此不知道。。。?,vb.net,events,Vb.net,Events,我有一份申请 模块1-主要应用程序 DataAccessMananger—主应用程序中用于处理数据的类 配置-处理配置设置的不同项目(公共dll)中的类 这个问题。配置类如何处理DataAccessManager中的数据更改事件,而不知道DataAccessManager是什么,因为它们位于不同的类中 我能想到的唯一方法是让模块1处理来自DataAccessManager的事件,并让它在配置类中调用一个方法,但是我不喜欢这样,我希望配置能够处理它自己的数据更新 清澈如泥?有什么想法吗?VB.NE
理想情况下,我希望能够使用模块将“事件”从DAM类传递到config类…我能想到的最佳方法是在配置类(common.dll)中添加一个接口,该接口将由DataAccessManager实现。我假设主模块同时知道DataAccessManager和配置,对吗?如果是这样,下面可能是一个解决方案
Public Interface IConfiguration
Event ConfigChanged(sender As Object, e As configPropertyChanged)
End Interface
在本例中,我还创建了一个继承事件args的类
Public class configPropertyChanged
Inherits EventArgs
Public Property PropertyName() As string
Public Property NewValue() As String
Public Property OldValue() As String
Public sub New(Newvalue as string,OldValue as string,<CallerMemberName()> optional PropertyName as string = "")
Me.NewValue = Newvalue
Me.OldValue =OldValue
Me.PropertyName = PropertyName
End sub
End Class
如果您愿意,您可以完全跳过接口,让DataAccessManager向主模块引发一个事件,然后在主模块事件处理程序中,从配置类调用一个公共方法。请检查此项。当object1处理object2的事件时,从技术上提高内容质量将非常有用,实际发生的情况是,创建了一个引用object1中的方法的委托,该委托被传递给object2,后者将其存储在集合中。Object2引发事件实际上包括它遍历委托集合并调用每个委托。所以,你的两个类很可能互不了解,其中一个仍然处理另一个的事件,只要有其他类型知道这两个类,并且能够创建和传递委托。我很确定,除非你可以修改和编译Common.dll的新版本,否则你不能这样做。从那里,您可以创建允许动态添加事件侦听器的方法。恐怕您的模块无法订阅事件并调用Config类中的方法。
Public Class Configuration
Implements IDisposable
Private _ConfigList As New List(Of IConfiguration)
Public Sub RegisterConfig(Config As IConfiguration)
_ConfigList.Add(Config)
AddHandler Config.ConfigChanged, AddressOf ConfigChanged
End Sub
Public Sub ConfigChanged(sender As Object, e As configPropertyChanged)
Console.WriteLine("Config has changed.")
End Sub
#Region "IDisposable Support"
Private disposedValue As Boolean ' To detect redundant calls
Public Sub Dispose() Implements IDisposable.Dispose
For Each config As IConfiguration In _ConfigList
RemoveHandler config.ConfigChanged, AddressOf ConfigChanged
Next
_ConfigList.clear()
End Sub
#End Region
End Class
Public Class DataAccessMananger
Implements IConfiguration
Public Event ConfigChanged(sender As Object, e As configPropertyChanged) Implements IConfiguration.ConfigChanged
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(value As String)
If String.Compare(_Name, value, True) <> 0 Then
RaiseEvent ConfigChanged(Me, New configPropertyChanged(Value,_Name))
_Name = value
End If
End Set
End Property
End Class
Public Sub Main()
Dim MyManager As New DataAccessMananger
Dim MyConfig As New Configuration
MyConfig.RegisterConfig(MyManager)
MyManager.Name = "New name"
End Sub