我有多种能力,每种能力属于AbilityCategory类型。
AbilityCategory类型的示例有 AbilityCategory_Magic , AbilityCategory_Physical , AbilityCategory_Ranged , AbilityCategory_Biological ,以及列表继续......
AbilityCategories是源自能力的类。
能力是一个只能实例化 AbilityBaseData 对象传递到其构造函数的类。
我想找到将每个能力链接到名为defaultAbilityBaseDatabase的 Dictionary 中 AbilityBaseData 的方法。
每个功能最多只能在我的defaultAbilityBaseDatabase中链接到最多1个 AbilityBaseData 实例。
-- AbilityBaseData.cs
[System.Serializable]
public class AbilityBaseData{
[SerializableField] Sprite abilityImage;
}
我目前的代码结构:
-- AbilityDatabase.cs
enum EAbilityCategory_Magic{
Fireball,
IceBolt,
BlackMagic
};
enum EAbilityCategory_Physical{
SwordLance,
FearlessBlow,
RagnarokRage
};
enum EAbilityCategory_Ranged{
Snipe,
RainOfArrows,
CrossbowShot
};
enum EAbilityCategory_Biological{
VirusUnleash,
SuperBug
};
enum Eblabla{};
enum Eevenmore{};
... There are many more abilities ...
...
Dictionary<EAbilityCategory_Magic,AbilityBaseData> defaultMagicAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Physical,AbilityBaseData> defaultPhysicalAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Ranged,AbilityBaseData> defaultRangedAbilityBaseDataDatabase;
Dictionary<EAbilityCategory_Biological,AbilityBaseData> defaultBiologicalAbilityBaseDataDatabase;
... list keeps going on...
代码结构寻找:
-- AbilityDatabase.cs
enum class EAbility{}
enum EAbilityCategory_Magic : EAbility{
Fireball,
IceBolt,
BlackMagic
};
enum EAbilityCategory_Physical : EAbility{
SwordLance,
FearlessBlow,
RagnarokRage
};
enum EAbilityCategory_Ranged : EAbility{
Snipe,
RainOfArrows,
CrossbowShot
};
enum EAbilityCategory_Biological : EAbility{
VirusUnleash,
SuperBug
};
... There are many more abilities ...
...
Dictionary<EAbility,AbilityBaseData> defaultAbilityBaseDataDatabase;
这是我遇到此问题后尝试使用的解决方法
What variable type should I use to store types of a non sealed class or interface?
其中可能是这样的:
//I can remove all enumerations have such a clean, one-line code
Dictionary<typeof(Ability),AbilityBaseData> defaultAbilityBaseDataDatabase;
我无法结合所有这些能力:
enum EAbility{
Fireball,IceBolt,BlackMagic,SwordLance,FearlessBlow,RagnarokRage,Snipe,.....
};
因为它会阻止我这样做:
-- MagicAbilityFactory.cs
AbilityCategory_Magic Create(EAbilityCategory_Magic magicAbilityCategory, AbilityBaseData defaultAbilityBaseData){
switch(magicAbilityCategory){
case Fireball:
return new AbilityCategory_Magic_Fireball(abilityBaseData,other parameters);
case blabla:
}
return null;
}
这可能是一个选项https://stackoverflow.com/posts/3460047/revisions,但问题是我宁愿找到一个干净的解决方案,因为我有数以千计的能力,所以不需要我添加这么多行代码。
答案 0 :(得分:1)
这在C#中是不可能的。这个决定的有益权衡是 enums 是值类型,因此是轻量级结构而不是类。这可以减少GC对这些常见的非常小的物体的内存压力。如果您对C#团队的设计决定有疑问,那么您应该向Microsoft提出这个问题。
除了通过 Enum 类和Extension方法的静态方法提供的功能之外,还需要其他功能,只需从头开始声明自己的自定义类/结构和继承层次结构。
来自Enumeration Types上的MSDN:
所有枚举都是 System.Enum 类型的实例。您无法从 System.Enum 派生新类,但您可以使用其方法来发现有关枚举实例中的值的信息并对其进行操作。
来自课程System.Enum
上的MSDN