运行时填充已知为数组类型的泛型对象的实现问题
解决方案
首先,你不需要通过遍历IEnumerable接口来获取数组的元素类型,直接用typeof(T).GetElementType()就能拿到目标类型,这比原方式更简洁高效。
问题核心在于items.ToArray()生成的是object?[],而你需要的是元素类型为baseType的强类型数组,直接强制转换会因为类型不匹配编译失败。正确的做法是用反射创建对应元素类型的数组,再把列表元素复制进去,最后转换为T。
修改后的完整代码如下:
static void Main(string[] args) { Console.WriteLine("Hello, World!"); Testing test = new Testing(); DataClass[] output = test.MyMethod<DataClass[]>(); } public class DataClass { public int I = 0; public DataClass() { } } public class Testing { public T MyMethod<T>() { if (typeof(T).IsArray) { Type baseType = typeof(T).GetElementType()!; List<object?> items = new List<object?>(); for (int i = 0; i < 5; i++) { items.Add(Activator.CreateInstance(baseType)); } // 创建对应元素类型的数组 Array array = Array.CreateInstance(baseType, items.Count); // 复制列表元素到目标数组 items.CopyTo(array); // 先转object再转T,编译器无法直接推断Array与T的类型关系,但已验证T是数组,转换安全 return (T)(object)array; } return default(T)!; } }
关键修改点说明:
- 替换元素类型获取逻辑:
typeof(T).GetElementType()直接提取数组的元素类型,无需遍历接口集合 - 创建强类型数组:用
Array.CreateInstance(baseType, items.Count)生成对应元素类型的数组,避免生成object?[] - 元素复制:通过
items.CopyTo(array)完成列表到目标数组的元素转移 - 类型转换:先将
Array转成object再转T,绕开编译器的类型检查(已提前验证T是数组类型,转换安全)
内容的提问来源于stack exchange,提问作者GafferMan2112
相关产品推荐
相关产品推荐

