首页 > 解决方案 > 继承自抽象类的泛型类的 C# 类型

问题描述

我正在努力寻找一种简单的方法来获取基于从抽象类继承的泛型类的类型。

我有这个层次结构:

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 Assets。我正在使用 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>)这一点?(可能是奥丁特定的??(编辑时间?))

标签: c#unity3dgenericsinheritance

解决方案


为所有非通用的东西创建一个类(或者留空):

public class ItemBase : ScriptableObject 
{
    /* nothing, or non-generic stuff here */
}

然后,从它继承您现在拥有的通用项目:

public class Item<T> : ItemBase 
{
    /*...*/
}

然后,您可以使用tree.AddAllAssetsAtPath("TEMPLATES", "Assets/Scriptable/Templates", typeof(ItemBase));


推荐阅读