是否可以保存一个类型(使用“typeof()”)在枚举中

本文关键字:typeof 使用 枚举 一个 保存 是否 类型 | 更新日期: 2023-09-27 18:37:03

所以我正在XNA、C#4.0中创建一个游戏,我需要管理很多PowerUp(代码中的PowerUp都继承自类"PowerUp"(,并且为了处理PowerUp的后端管理,我目前有一个枚举PowerupEffectType,每个PowerUp子类都有一个值。最后,在代码中,我需要将PowerupEffectType转换为Powerup类型(属于Type类,通常使用typeof([class name])实现(。

由于这是一个小组项目,我想尽可能地将PowerupEffectType的每个值与其对应的类Type结合起来,即:不要期望我的其他程序员使用switch语句手动进行转换,并确保以后的添加/扩展在尽可能少的地方涉及尽可能少地更改。我有几个选择,到目前为止,我发现最好的方法是创建枚举伪方法,将所有内容浓缩为一个switch语句(99%是我想要的(,这要归功于我在这里找到的一些技巧:http://msdn.microsoft.com/en-us/library/bb383974.aspx

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

需要明确的是,这是我希望我能做的,我正在寻找一种方法:

// (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)
}

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

提前感谢!

是否可以保存一个类型(使用“typeof()”)在枚举中

不能将其作为枚举的,但可以在属性中指定:

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
}

然后,您可以在执行时通过反射提取这些属性值。然而,我会个人只创建一个字典:

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

不需要特殊的属性,也不需要用复杂的反射代码提取值。

这并不是你想要的。我觉得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();

这样的东西怎么样?

您可以获得使用枚举所做的类型安全性,以及到类型的隐式转换

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>。我相信这就是你想要的那种"婚姻"。它将允许简单的枚举和访问。

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

对不起,我不太理解这一点,你实际上想实现什么;你能摘录一段代码吗?我不知道为什么不能在这里只使用继承,也不知道枚举为类型继承提供了什么。在我看来,你提出的是解决方案而不是问题,我可能完全错了,你能澄清一下你计划如何使用这些元信息吗?

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

您将如何处理类型信息?如果这些类型都继承自一个基类型,那么它们可能具有公共功能,可以在abstract方法中为任何特殊情况处理指定这些功能,或者可能返回一个Null Object,其中没有任何操作(或者可能只是什么都不做(。这样,您就不必担心添加新类,因为它们必须具有必要的行为。我尽量避免Enum,除非在实际枚举一组固定的任意值的情况下,它们是不灵活的。Enum必须保持,这在实践中是非常困难的。

实际上,我认为您可能需要了解依赖项注入框架。

看起来你正试图让其他开发人员处理不同的组件,然后你正试图在代码库的一个中心位置将它们集成在一起。

几个项目看:

  • http://www.ninject.org/
  • http://docs.structuremap.net/
  • http://archive.msdn.microsoft.com/mef