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

如何通过反射调用ImmutableArray.Create创建不可变数组(解决重载歧义)

解决反射调用ImmutableArray.Create的重载歧义问题

直接调用typeof(ImmutableArray).GetMethod(nameof(ImmutableArray.Create))会因为该方法存在多个重载(如接受单个元素、多个元素、数组等版本)触发歧义异常,解决核心是精准定位到接受T[]参数的泛型重载,再针对实际数组的元素类型构造泛型方法。

具体实现代码

// 假设arr是实际类型为T[]的object变量
if (arr is not Array array)
{
    throw new ArgumentException("传入参数必须是数组类型");
}

Type elementType = array.GetType().GetElementType();
// 筛选出接受T[]参数的Create泛型方法定义
MethodInfo createMethodDef = typeof(ImmutableArray)
    .GetMethods(BindingFlags.Public | BindingFlags.Static)
    .Where(m => m.Name == nameof(ImmutableArray.Create) && m.IsGenericMethodDefinition)
    .Single(m =>
    {
        ParameterInfo[] parameters = m.GetParameters();
        // 匹配参数为单个T[]的重载(params语法本质是数组参数)
        return parameters.Length == 1 
               && parameters[0].ParameterType.IsArray 
               && parameters[0].ParameterType.GetElementType() == m.GetGenericArguments()[0];
    });

// 构造对应元素类型的泛型方法实例
MethodInfo targetMethod = createMethodDef.MakeGenericMethod(elementType);
// 调用静态方法,参数包装为object数组
var immutableArray = targetMethod.Invoke(null, new object[] { arr });

关键说明

  1. 筛选泛型方法定义:通过GetMethods遍历所有静态公开方法,筛选出名为Create的泛型方法定义,再通过参数特征(单个数组参数,且数组元素类型与泛型参数一致)锁定目标重载。
  2. 构造泛型方法:根据传入数组的实际元素类型,将泛型方法定义构造成可执行的具体方法。
  3. 反射调用:静态方法调用时第一个参数传null,参数需包装为object[]传入(即使只有一个参数)。

内容的提问来源于stack exchange,提问作者Node.JS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:47:27