2017-02-16 76 views
0

我有一个文件夹监视应用程序,其中大约25个filewatchers监视25个文件夹。每个命名FSW1,FSW2的filewatchers的....如何使用反射从其名称作为字符串访问对象

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循环来实现这一点,而无需为每个filewatchers写入单独的代码块。我想用一些可以实现的反射技术。

回答

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) 

这得到现场用适当的名称,并将其值(我假定它是基于其命名字段),您刚刚创建的对象。

+0

对不起朋友,其实它的一个项目上的现有代码已经运行了3年4年我猜。所以有很多地方使用它。那么除了数组之外,还有其他可能性吗? –

+0

然后我强烈建议重构代码。如果这不是一个选项,我已经在我的答案中添加了更多信息。 –

+0

这真的很好,我的朋友..感谢那..做了我的一天 –

相关问题