VB.NET反射创建实例时,如何获取已实例化类列表并避免重复创建?
VB.NET 反射创建实例的单例缓存方案
由于.NET没有内置的遍历所有已创建类实例的机制,你需要自己维护一个缓存容器来避免重复创建同一类的实例。以下是具体实现方案:
核心思路
- 用静态字典缓存已创建的实例,以类的完整类型名为键(确保唯一)
- 先在当前程序集中查找目标类的类型(解决不知道命名空间的问题)
- 检查缓存,存在则直接返回,不存在则创建实例并加入缓存
代码实现
1. 定义静态缓存容器
' 静态字典:键为类的完整类型名,值为对应实例 Private Shared instanceCache As New Dictionary(Of String, Object)()
2. 实现获取/创建实例的方法
''' <summary> ''' 获取或创建指定类的单例实例 ''' </summary> ''' <param name="className">类名(支持大小写不敏感匹配)</param> ''' <param name="constructorParams">构造函数参数列表</param> ''' <returns>目标类的实例</returns> Private Function GetOrCreateInstance(className As String, ParamArray constructorParams As Object()) As Object ' 在当前程序集中查找匹配的类型 Dim targetType As Type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault( Function(t) t.Name.Equals(className, StringComparison.OrdinalIgnoreCase) ) If targetType Is Nothing Then Throw New ArgumentException($"未找到类:{className}") End If Dim typeFullName As String = targetType.FullName ' 检查缓存中是否存在实例 If instanceCache.TryGetValue(typeFullName, Dim existingInstance) Then Return existingInstance End If ' 创建新实例并加入缓存 Dim newInstance As Object = Activator.CreateInstance( targetType, BindingFlags.OptionalParamBinding Or BindingFlags.Instance Or BindingFlags.Public, Nothing, constructorParams, Nothing ) instanceCache.Add(typeFullName, newInstance) Return newInstance End Function
3. 使用示例
Try ' 获取或创建实例 Dim myInstance As Object = GetOrCreateInstance("MyTargetClass", param_list) ' 调用实例方法(假设方法名为RunMyFunction) myInstance.GetType().InvokeMember( "RunMyFunction", BindingFlags.InvokeMethod Or BindingFlags.Public Or BindingFlags.Instance, Nothing, myInstance, Nothing ) Catch ex As Exception Console.WriteLine($"操作失败:{ex.Message}") End Try
关键说明
- 遍历程序集类型时,
FirstOrDefault会返回第一个匹配类名的类型,如果存在同名类(不同命名空间),需要调整匹配逻辑(比如传入部分命名空间) - 缓存使用静态字典,确保在程序生命周期内实例唯一
- 如果需要支持实例销毁,可以添加移除缓存的方法
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

