如何通过反射调用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 });
关键说明
- 筛选泛型方法定义:通过
GetMethods遍历所有静态公开方法,筛选出名为Create的泛型方法定义,再通过参数特征(单个数组参数,且数组元素类型与泛型参数一致)锁定目标重载。 - 构造泛型方法:根据传入数组的实际元素类型,将泛型方法定义构造成可执行的具体方法。
- 反射调用:静态方法调用时第一个参数传
null,参数需包装为object[]传入(即使只有一个参数)。
内容的提问来源于stack exchange,提问作者Node.JS
相关产品推荐
相关产品推荐

