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

C#泛型方法如何判断选中对象与泛型T为相同类型

问题根因

原代码无法正常生效有两个核心原因:

  1. 泛型参数T没有添加类型约束,C#编译器默认将T视为普通System.Object类型处理,is T类型校验对Unity自定义资源、内置资源等UnityEngine.Object子类会出现判定失效,同时selectedList.Remove(selectedObject)传入的是UnityEngine.Object类型,和List<T>元素类型不匹配,会直接抛出编译错误。
  2. 错误日志打印逻辑依赖传入的selectedClass参数,若参数为null会无法正确输出目标类型,且没有对选中对象是否为Project窗口资产做校验,选中场景内对象时会触发删除无效报错。
修复方案

给泛型参数添加UnityEngine.Object类型约束,配合C#模式匹配完成类型校验和转换,移除冗余参数即可让逻辑正常运行,修正后代码如下:

using UnityEditor;
using UnityEngine;
using System.Collections.Generic;

private void DeleteSelectedObject<T>(List<T> selectedList) where T : UnityEngine.Object
{
    Object selectedObject = Selection.activeObject;
    // 模式匹配同时完成类型校验和转换,避免额外强转
    if (selectedObject is T targetAsset)
    {
        string assetPath = AssetDatabase.GetAssetPath(selectedObject);
        // 过滤非Project窗口资产的情况
        if (!string.IsNullOrEmpty(assetPath))
        {
            AssetDatabase.DeleteAsset(assetPath);
            // 刷新资源数据库保证状态同步
            AssetDatabase.Refresh();
            // 传入类型完全匹配的对象执行移除
            selectedList.Remove(targetAsset);
        }
    }
    else
    {
        Debug.LogError($"选中对象类型不匹配,期望类型为{typeof(T).Name}");
    }
}
关键说明
  • 泛型约束where T : UnityEngine.Object是核心:所有Unity资产都继承自UnityEngine.Object,添加约束后编译器会正确处理Unity对象的类型判定、伪null校验逻辑,不会再出现泛型类型校验失效的问题。
  • 原方法的selectedClass属于冗余参数,获取泛型目标类型直接调用typeof(T)即可,不受传入参数状态影响,稳定性更高。
  • 删除资源后调用AssetDatabase.Refresh()可以立刻同步编辑器资源状态,避免出现资源已删除但窗口/列表仍显示旧数据的问题。
  • 增加资产路径非空判断,可以过滤选中Hierarchy窗口场景对象的场景,避免无效调用删除接口报错。

内容的提问来源于stack exchange,提问作者Invix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:51:19