You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否让方法根据传入参数改变返回类型?泛型使用遇阻求助

解决泛型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);
}

关键修改说明

  1. 添加泛型约束:where T : Script
    这会告诉编译器T必须是Script类或它的子类,让编译器认可Script类型对象向T类型的转换操作。

  2. 类型判断与转换优化:
    用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:22:09