Unity/C#中如何遍历泛型值列表?能否将不同泛型类型的Dynamic<T>实例存入列表并统一调用方法?
1. Unity/C#中遍历泛型值列表的方法
当然有!C#里的泛型列表List<T>本身就实现了IEnumerable<T>接口,最常用的遍历方式就是直接用foreach循环,比如:
// 示例:遍历字符串泛型列表 List<string> stringList = new List<string> { "玩家1", "玩家2", "玩家3" }; foreach (var playerName in stringList) { Debug.Log(playerName); // Unity中打印内容 }
除此之外,你还可以用List<T>自带的ForEach方法(传入lambda表达式更简洁):
List<int> scoreList = new List<int> { 85, 92, 78 }; scoreList.ForEach(score => Debug.Log($"分数:{score}"));
如果需要复杂逻辑,还能结合LINQ(记得引入System.Linq命名空间)做过滤、转换后再遍历:
var highScores = scoreList.Where(score => score >= 90); foreach (var score in highScores) { Debug.Log($"高分:{score}"); }
2. 遍历不同泛型类型的Dynamic<T>实例并执行操作
你原本的代码逻辑是行不通的,因为List<Dynamic<T>>要求T是一个固定的具体类型——要么全是Dynamic<float>,要么全是Dynamic<Vector2>,没法把不同泛型参数的实例塞进同一个泛型列表里,毕竟Dynamic<float>和Dynamic<Vector2>是完全独立的类型,它们唯一的共同父类是object,直接用object列表又得强制转换,非常麻烦。
不过我们可以通过非泛型接口/抽象基类解决这个问题,核心是让所有Dynamic<T>都遵循同一个非泛型契约,这样就能把它们放进同一个基于契约的列表中统一处理。
具体实现步骤
第一步:定义非泛型接口
先创建一个不带泛型参数的接口,包含你要统一调用的SetDefaultValue方法:
public interface IDynamic { void SetDefaultValue(); }
第二步:修改Dynamic<T>类实现接口
让你的泛型类继承并实现这个接口:
public class Dynamic<T> : IDynamic { public T value; public T defaultVal; // 原本的方法现在同时满足接口契约 public void SetDefaultValue() { value = defaultVal; } }
第三步:创建接口列表并遍历
现在你就可以创建List<IDynamic>类型的列表,添加不同泛型参数的Dynamic<T>实例,然后遍历调用方法:
List<IDynamic> dynamics = new List<IDynamic>(); dynamics.Add(new Dynamic<float> { defaultVal = 0.0f }); dynamics.Add(new Dynamic<Vector2> { defaultVal = Vector2.zero }); // 遍历并统一调用SetDefaultValue foreach (var item in dynamics) { item.SetDefaultValue(); }
补充说明
这种方式完全可行,本质是利用面向对象的多态性——虽然每个Dynamic<T>的具体类型不同,但它们都遵循IDynamic的契约,所以可以统一处理。如果你不想用接口,也可以定义一个抽象基类(比如AbstractDynamic),把SetDefaultValue定义为抽象方法,让Dynamic<T>继承并实现它,效果是一样的。
内容的提问来源于stack exchange,提问作者bleat interteiment

