能否让方法根据传入参数改变返回类型?泛型使用遇阻求助
解决泛型GetScript方法的类型转换问题
你的问题出在两个核心点:泛型类型未加约束和缺少合法的类型转换逻辑,以下是具体修正方案:
修正后的泛型GetScript方法
public T GetScript<T>() where T : Script { for (int i = 0; i < Scripts.Count; i++) { // 用is判断更灵活,支持子类匹配(比如继承自Camera的子类也能被识别) if (Scripts[i] is T targetScript) { return targetScript; } } return default(T); }
关键修改说明
添加泛型约束:
where T : Script
这会告诉编译器T必须是Script类或它的子类,让编译器认可Script类型对象向T类型的转换操作。类型判断与转换优化:
用Scripts[i] is T targetScript替代原有的GetType() == typeof(T),既完成了类型检查,又直接将对象转换为T类型变量,避免了单独的强制转换代码。
如果需要严格匹配类型(不包含子类),可以保留原判断逻辑,但必须显式转换:if (Scripts[i].GetType() == typeof(T)) { return (T)Scripts[i]; }
更简洁的LINQ实现
如果项目允许使用LINQ,还可以把代码简化到一行:
using System.Linq; public T GetScript<T>() where T : Script { return Scripts.OfType<T>().FirstOrDefault(); }
OfType<T>()会自动筛选列表中属于T类型(包括子类)的元素,FirstOrDefault()返回第一个匹配项,无匹配则返回default(T)。
调用示例
现在可以直接调用并赋值给子类变量,无需额外转换:
Camera camera = go.GetScript<Camera>(); Cube cube = go.GetScript<Cube>();
内容的提问来源于stack exchange,提问作者Waarnov
相关产品推荐
相关产品推荐

