C#泛型方法如何判断选中对象与泛型T为相同类型
问题根因
原代码无法正常生效有两个核心原因:
- 泛型参数T没有添加类型约束,C#编译器默认将T视为普通
System.Object类型处理,is T类型校验对Unity自定义资源、内置资源等UnityEngine.Object子类会出现判定失效,同时selectedList.Remove(selectedObject)传入的是UnityEngine.Object类型,和List<T>元素类型不匹配,会直接抛出编译错误。 - 错误日志打印逻辑依赖传入的
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
相关产品推荐
相关产品推荐

