如何为泛型Grid类的数组按类型填充指定默认值?
解决泛型Grid类的数组填充问题
好的,我来帮你搞定这个需求。首先得纠正一个小细节:.NET原生数组并没有FillArray<T>()方法,所以我们需要自己实现这个填充逻辑。这里我推荐用扩展方法来实现,既符合你代码里的调用习惯,还能复用在其他数组上。
实现思路
核心思路是在泛型方法里针对不同的T类型做分支处理:当T是int时填充-1,是bool时填充false,其他类型可以默认填充default(T)(比如string填null,float填0等)。
步骤1:编写数组扩展方法
创建一个静态类来存放扩展方法,用模式匹配处理不同类型的数组,比直接判断typeof更优雅:
public static class ArrayExtensions { public static void FillArray<T>(this T[] array) { // 先做null检查,避免空引用异常 if (array == null) throw new ArgumentNullException(nameof(array), "数组不能为null"); // 用模式匹配分支处理不同类型数组 switch (array) { case int[] intArray: // 用.NET内置的Array.Fill高效填充-1 Array.Fill(intArray, -1); break; case bool[] boolArray: // 按需求填充false(其实default(bool)就是false,这里明确指定更直观) Array.Fill(boolArray, false); break; default: // 其他类型填充默认值,比如string为null、double为0等 Array.Fill(array, default(T)); break; } } }
步骤2:修改Grid类的构造函数
现在你的Grid类可以直接调用这个扩展方法了,不需要手动指定<T>,编译器会自动推断类型:
public class Grid<T> { public T[] gridArray; public Grid(int size) { gridArray = new T[size]; // 直接调用扩展方法,类型自动推断 gridArray.FillArray(); } }
测试验证
你可以用下面的代码测试效果:
// 测试int类型的Grid var intGrid = new Grid<int>(5); // intGrid.gridArray的每个元素都是-1 // 测试bool类型的Grid var boolGrid = new Grid<bool>(3); // boolGrid.gridArray的每个元素都是false // 测试其他类型(比如string) var stringGrid = new Grid<string>(2); // stringGrid.gridArray的每个元素都是null(default(string))
额外说明
- 如果后续需要给其他类型添加特殊填充规则,只需要在
switch里加对应的case即可,比如case float[] floatArray: Array.Fill(floatArray, 0.5f); break; Array.Fill是.NET Core 3.0+和.NET 5+才有的方法,如果你的项目用的是旧版本(比如.NET Framework),可以替换成手动循环填充:for (int i = 0; i < intArray.Length; i++) { intArray[i] = -1; }
内容的提问来源于stack exchange,提问作者Tobias Weger
相关产品推荐
相关产品推荐

