如何使用反射从名称作为字符串访问对象

时间:2017-02-16 07:09:27

标签: vb.net reflection

我有一个文件夹监控应用程序,其中大约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循环来实现这一点,而无需为每个文件管理器编写单独的代码块。我想使用一些反射技术可以实现。

1 个答案:

答案 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)

这将获取具有适当名称的字段,并将其值设置为刚刚创建的对象(我假设它是基于其命名的字段)。