【发布时间】:2021-07-05 17:06:46
【问题描述】:
我正在努力寻找一种简单的方法来获取基于从抽象类继承的泛型类的类型。
我有这个层次结构:
public abstract class BaseItemData {}
public abstract class WearableItemData : BaseItemData {}
----
public class EquipmentItemData : WearableItemData {}
public class WeaponItemData : WearableItemData {}
----
public class Item<T> : ScriptableObject {}
public class EquipmentItem : Item<EquipmentItemData> { }
public class WeaponItem : Item<WeaponItemData> { }
有了这个,我想在编辑器时获取所有 Scriptable Objects 资产。
我正在使用 Odin Inspector 构建自定义编辑器,并希望将 Item 类型的所有资产添加到树中
但我不能这样做,因为泛型类型需要传递给Item
protected override OdinMenuTree BuildMenuTree() {
OdinMenuTree tree = new OdinMenuTree();
// THIS WORKS
tree.AddAllAssetsAtPath("TEMPLATES/Weapons", "Assets/Scriptable/Templates", typeof(WeaponItem));
tree.AddAllAssetsAtPath("TEMPLATES/Equipment", "Assets/Scriptable/Templates", typeof(EquipmentItem));
// BUT I WOULD LIKE TO HAVE SOMETHING MORE LIKE THIS
tree.AddAllAssetsAtPath("TEMPLATES", "Assets/Scriptable/Templates", typeof(Item)); // or typeof(Item<WearableItemData>)
return tree;
}
这些作品
typeof(Item<WeaponItemData>)
typeof(Item<EquipmentItemData>)
typeof(WeaponItem)
typeof(EquipmentItem)
但是这些并不像我想象的那样(显然抽象类不起作用???)
typeof(Item<BaseItemData>)
typeof(Item<WearableItemData>)
我怎样才能使typeof(Item<WearableItemData>) 可以工作? (可能是 Odin 特定的??(编辑时间?))
【问题讨论】:
-
“获取所有对象”是什么意思?你是怎么得到它们的?
-
我按预期获得了所有类型。也许这个问题需要重新处理
-
听起来像是 XY 问题。你为什么要使用
typeof(Item<WearableItemData>)?您是要获取该可编写脚本对象的所有 assets,还是该可编写脚本对象的所有(运行时)instances?此外,这是否适用于仅应在编辑时使用的代码?还是这段代码需要在游戏中运行?需要更多信息。问题背后的意图过于模糊,无法提供最有用的建议。 -
忘记链接了:XY problem
-
我以前从未使用过 odin。这是一种 hack,但是如果你创建一个虚拟类
public class ItemBase : ScriptableObject {/*nothing*/},然后用public class Item<T> : ItemBase {/*...*/}从它继承,那么你可以使用typeof(BaseItem)?我不知道 odin 是如何在后台使用Type参数的。
标签: c# unity3d generics inheritance