Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从抽象类继承的泛型类的类型_C#_Unity3d_Generics_Inheritance - Fatal编程技术网

C#从抽象类继承的泛型类的类型

C#从抽象类继承的泛型类的类型,c#,unity3d,generics,inheritance,C#,Unity3d,Generics,Inheritance,我正在努力寻找一种基于从抽象类继承的泛型类获取类型的简单方法 我有这样的层次结构: public abstract class BaseItemData {} public abstract class WearableItemData : BaseItemData {} ---- public class EquipmentItemData : WearableItemData {} public class WeaponItemData : WearableItemData {} -

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

我有这样的层次结构:

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> { }
这些作品

typeof(Item<WeaponItemData>)
typeof(Item<EquipmentItemData>)
typeof(WeaponItem)
typeof(EquipmentItem)
typeof(项目)
类型(项目)
类型(武器项目)
类型(设备项)
但这些并不像我想的那样(显然抽象类不起作用?)

typeof(项目)
类型(项目)

我怎样才能使
typeof(Item)
有效?(可能是特定于Odin的??(编辑时间?)

为所有非泛型内容创建一个类(或者只留下空的):

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

public class Item<T> : ItemBase 
{
    /*...*/
}
公共类项目:ItemBase
{
/*...*/
}

然后,您可以使用
tree.AddAllAssetsAtPath(“模板”、“资产/脚本/模板”、typeof(ItemBase))

您所说的“获取所有对象”是什么意思?你怎么弄到的?我按预期弄到了所有类型的。也许这个问题需要像XY问题一样重新处理。为什么要尝试使用
typeof(Item)
?您正在尝试获取该可脚本对象的所有资产,还是获取该可脚本对象的所有(运行时)实例?此外,这是否适用于只应在编辑时使用的代码?或者这个代码需要在游戏中运行?我需要更多的信息。问题背后的意图太模糊,无法提供最有用的建议。忘记链接:我以前从未使用过odin。这是一种黑客行为,但是如果您创建一个伪类
公共类itembease:ScriptableObject{/*nothing*/}
,然后使用
公共类Item:itembease{/*…*/}
从中继承,那么您可以使用
类型化(BaseItem)
?我不知道odin是如何在引擎盖下使用
Type
参数的。实际上,它根本不是一个“黑客”。。当我有泛型基类时,我经常使用它。。简单地把所有非泛型的东西放在非泛型的基础上,只把泛型的东西放在泛型的基础上。这样的话,这个图案就很强大了。。例如,您可以通过这种方式简单地使用
Resources.FindObjectsOfTypeAll()
,而不必提供泛型类型;)哦,这是一个有趣的观点。谢谢。是的,它更多地与通用接口和非通用基本接口相结合。。同样的原则顺便说一句,具有相同名称的非泛型和泛型类型也是完全合法的,因此这里例如
Item:ScriptaleObject
Item:Item
;)我对这个事实深感不安,哈哈
typeof(Item<BaseItemData>)
typeof(Item<WearableItemData>)
public class ItemBase : ScriptableObject 
{
    /* nothing, or non-generic stuff here */
}
public class Item<T> : ItemBase 
{
    /*...*/
}