如何将泛型类型传入新泛型对象?合并相似泛型方法遇阻
解决泛型方法中Unity AddComponent的调用错误问题
嗨,这个问题我太熟悉了!咱们先拆解一下问题出在哪,再给出修复方案:
错误原因分析
你之所以在obj.AddComponent<typeof(T)>()这行出错,是因为**AddComponent<>是泛型方法,它需要的是一个编译时确定的类型参数,而typeof(T)返回的是一个System.Type对象(运行时的类型信息)**——这俩根本不是一回事,编译器自然会报错。
修复步骤
1. 给泛型方法添加类型约束
首先,咱们要确保泛型参数T是Actor的子类(因为你的Character和Npc都继承自Actor),这样既能保证类型安全,也能让编译器允许我们调用Unity的AddComponent<T>()方法(毕竟Unity要求组件必须继承自Component,而你的Actor应该是MonoBehaviour的子类吧?)。
2. 修正AddComponent的调用方式
直接把typeof(T)换成泛型参数T就行,因为泛型方法已经知道T的类型了,不需要再用typeof去获取。
完整示例代码
// 泛型方法的正确定义 public void GetDrawnActor<T>(Dictionary<uint, T> actorDict) where T : Actor { foreach (var (id, actorData) in actorDict) { GameObject obj = new GameObject($"Actor_{id}"); // 这里是修正后的核心代码 T actorComponent = obj.AddComponent<T>(); // 接下来可以复用原来DrawCharacter/DrawNpc里的通用逻辑 // 比如给actorComponent赋值、设置位置等等 actorComponent.Setup(actorData); } }
额外说明
如果你的Actor类不是直接继承自Unity的Component,那可能需要调整约束或者逻辑,但从你用AddComponent来看,应该是Unity场景下的开发,所以上面的约束where T : Actor完全够用——只要Actor本身继承自MonoBehaviour(或Component)就行。
要是还有一些针对Character或Npc的特殊逻辑没法直接复用,你可以考虑在Actor里定义虚方法,然后让子类重写,这样在泛型方法里直接调用虚方法就能自动适配不同子类的行为了。
内容的提问来源于stack exchange,提问作者Toofy
相关产品推荐
相关产品推荐

