是否有可能在枚举中保存一个types(使用“typeof()”)?

所以我用XNA创build了一个游戏,C#4.0,我需要pipe理很多PowerUps(代码中的所有代码都是从“PowerUp”类inheritance的),并且处理PowerUps的后端pipe理。枚举PowerupEffectType,每个PowerUp子类都有一个值。 最终在代码中,我需要从PowerupEffectType转换为Poweruptypes(类Type ,通常使用typeof([class name]) )。

由于这是一个组合项目,所以我希望尽可能地将PowerupEffectType的每个值都结合到相应的类types中,即:不仅期望其他程序员使用switch语句手动进行转换,并确保稍后添加/扩展涉及尽可能less的地方尽可能less的变化。 我有几个选项,迄今为止发现的最好的方法是创buildenum伪方法,将所有东西压缩到一个switch语句(我想要的99%),这要归功于我在这里find的一些提示: http ://msdn.microsoft.com/en-us/library/bb383974.aspx

但我试图进一步 – 我可以保存Type enum 我知道你可以将枚举保存为一个特定types(链接: http : //msdn.microsoft.com/en-us/library/cc138362.aspx ),但Type不是其中之一。 当前的select是字节,sbyte,short,ushort,int,uint,long和ulong 。 是否有任何可行的方法来保存一个Type转换为上述任何数据types和返回?

要明确,这是我想我可以做的,我正在寻找一种方法:

 // (Assuming 'LightningPowerup', 'FirePowerup', and 'WaterPowerup' are // all declared classes that inherit from a single base class) public enum PowerupEffectType { LIGHTNING = typeof(LightningPowerup), FIRE = typeof(FirePowerup), WATER = typeof(WaterPowerup) } 

有没有办法做到这一点,或者我只是过于复杂的解决scheme,已经完成了99%的问题?

提前致谢!

你不能把它作为一个枚举的 ,但你可以在一个属性中指定它:

 using System; using System.Runtime.CompilerServices; [AttributeUsage(AttributeTargets.Field)] public class EffectTypeAttribute : Attribute { public Type Type { get; private set; } public EffectTypeAttribute(Type type) { this.Type = type; } } public class LightningPowerup {} public class FirePowerup {} public class WaterPowerup {} public enum PowerupEffectType { [EffectType(typeof(LightningPowerup))] Lightning, [EffectType(typeof(FirePowerup))] Fire, [EffectType(typeof(WaterPowerup))] Water } 

然后可以在执行时使用reflection来提取这些属性值。 不过,我个人只是创build一个字典:

 private static Dictionary<PowerupEffectType, Type> EffectTypeMapping = new Dictionary<PowerupEffectType, Type> { { PowerupEffectType.Lightning, typeof(LightningPowerup) }, { PowerupEffectType.Fire, typeof(FirePowerup) }, { PowerupEffectType.Water, typeof(WaterPowerup) } }; 

不需要一个特殊的属性,不需要用快速reflection代码来提取值。

这不是你所要求的。 我发现Jon的属性方法是最好的。 但是为什么不把它换成扩展方法呢?

 public Type GetPowerupEffectType(this PowerupEffectType powerEffect) { switch (powerEffect) { case LIGHTNING: return typeof(LightningPowerup); case FIRE: return typeof(FirePowerup); case WATER: return typeof(WaterPowerup); default: return default(Type); } } 

并称之为:

 PowerupEffectType e = PowerupEffectType.WATER; var t = e.GetPowerupEffectType(); 

这样的事情呢?

你得到了types安全,你用一个枚举,加上隐式转换为types

 public class PowerupEffectType { private readonly Type _powerupType; public static implicit operator Type(PowerupEffectType powerupEffectType) { return powerupEffectType._powerupType; } private PowerupEffectType(Type powerupType) { _powerupType = powerupType; } public static readonly PowerupEffectType LIGHTNING = new PowerupEffectType(typeof(LightningPowerup)); public static readonly PowerupEffectType FIRE = new PowerupEffectType(typeof(FirePowerup)); public static readonly PowerupEffectType WATER = new PowerupEffectType(typeof(WaterPowerup)); } 

你可以使用static Dictionary<PowerupEffectType, Powerup> 。 我相信那将是你所寻找的那种“婚姻”。 这将允许轻松枚举和访问。

您可以只使用数字types,如Microsoft的文档。 默认情况下,枚举中每个元素的基础types是int。 您可以使用冒号指定另一个整数值types,如前面的示例所示。 有关可能types的完整列表,请参见枚举。 参考:枚举types

对不起,我不太喜欢这个,你究竟在做什么, 你可以给代码摘录? 我不知道为什么你不能只在这里使用inheritance,枚举给你的typesinheritance没有。 我觉得像你提出的解决scheme,而不是问题,我可能是完全错误的,你能澄清你打算如何使用这个元信息?

我很困惑,你是否在问一些能告诉你types/类的实例的types? 您可以使用枚举来存储您所说的每种types的列表,但您为什么要这么做呢? 你说你不想让其他程序员使用switch语句,但是我很抱歉,我不能看到从某种types的枚举中存储types信息会带来什么好处。 每个实例都知道它是什么types,它可以做什么。

你将如何处理types信息? 如果这些types都是从一个基本typesinheritance的,那么它们可能具有可以在abstract方法中为任何特殊情况处理指定的通用function,或者返回一个Null Object (没有任何事情可以做或者什么都不做)。 这样你就不用担心增加新的类,因为它们必须有必要的行为。 我尽量避免使用Enum除非在实际上枚举了一组固定值的情况下,它们是不灵活的。 Enum必须保持,这是非常困难的(在实践中)。

我实际上认为你可能想看看dependency injection框架。

看起来你正在试图让其他开发者在不同的组件上工作,然后你试图把他们全部集成到代码库中的一个中心位置。

几个项目要看: