You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET反射创建实例时,如何获取已实例化类列表并避免重复创建?

VB.NET 反射创建实例的单例缓存方案

由于.NET没有内置的遍历所有已创建类实例的机制,你需要自己维护一个缓存容器来避免重复创建同一类的实例。以下是具体实现方案:

核心思路

  1. 用静态字典缓存已创建的实例,以类的完整类型名为键(确保唯一)
  2. 先在当前程序集中查找目标类的类型(解决不知道命名空间的问题)
  3. 检查缓存,存在则直接返回,不存在则创建实例并加入缓存

代码实现

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:15:59