我有一个文件夹监控应用程序,其中大约25个文件监视器监视25个文件夹。每个文件监视器都命名为fsw1,fsw2 ....
bCreateFileCheck = True
fsw1 = New FileSystemWatcher(My.Settings.UserRootFolder1)
fsw1.IncludeSubdirectories = True
fsw1.EnableRaisingEvents = True
fsw1.NotifyFilter = (NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName)
所以这是对25个文件夹的重复,但唯一的区别是fsw1到fsw2,fsw3等的名称更改以及My.Settings.UserRootFolder1到My.Settings.UserRootFolder2,My.Settings.UserRootFolder3等的名称。
那么我们如何使用for循环来实现这一点,而无需为每个文件管理器编写单独的代码块。我想使用一些反射技术可以实现。
答案 0 :(得分:2)
不要让你的生活比你需要的更难。使用数组(如果您需要灵活的话,请使用List(Of T)
):
Dim watchers(24) As FileSystemWatcher
For i As Integer = 0 To watchers.GetUpperBound(0)
Dim path = CStr(My.Settings.Item("UserRootFolder" & (i + 1)))
watchers(i) = New FileSystemWatcher(path)
'Do further initialization...
Next
如果结构已修复且您无法真正更改它,则可以将变量设置为您在For
循环中创建的对象。因此,按如下方式更改循环:
'...
Dim watcher = New FileSystemWatcher(...)
Me.GetType().GetField("fsw" & (i + 1)).SetValue(Me, watcher)
这将获取具有适当名称的字段,并将其值设置为刚刚创建的对象(我假设它是基于其命名的字段)。