如何将System.Enum转换为基本整数?

18 浏览
0 Comments

如何将System.Enum转换为基本整数?

我想创建一个通用的方法,将任何System.Enum派生类型转换为相应的整数值,不需要强制转换,最好也不需要解析字符串。\n例如,我想要的是这样的:\n

// 简单的例子,实际上不是我要做的事情。
class Converter
{
    int ToInteger(System.Enum anEnum)
    {
        return (int)anEnum;
    }
}

\n但是这似乎不起作用。Resharper报告说无法将类型为\'System.Enum\'的表达式转换为类型\'int\'。\n现在我想到了这个解决方案,但我希望有更高效的方法。\n

class Converter
{
    int ToInteger(System.Enum anEnum)
    {
        return int.Parse(anEnum.ToString("d"));
    }
}

\n有什么建议吗?

0
0 Comments

如何将System.Enum转换为基本整数?

如果您需要将任何枚举类型转换为其底层类型(并非所有枚举类型都由int支持),您可以使用以下代码:

return System.Convert.ChangeType(
    enumValue,
    Enum.GetUnderlyingType(enumValue.GetType()));

这是唯一的可靠答案。

这是否导致装箱拆箱?

是的。Convert.ChangeType接受object作为第一个参数,并返回object。

是的,我确实同意这一点,无论如何,您应该进行性能测试。BFree的解决方案是最快的,大约快了8倍。不过,我们仍然在谈论滴答声。

0
0 Comments

问题的原因是需要将System.Enum类型转换为基本整数类型。解决方法是使用extension method将enum值转换为int类型。

代码如下:

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return (int)((object)enumValue);
    }
}

另一种解决方法是使用Convert.ToInt32方法将enum值转换为int类型。

代码如下:

public static class EnumExtensions
{
    public static int ToInt(this Enum enumValue)
    {
        return Convert.ToInt32(enumValue);
    }
}

通过测试可以验证转换的正确性。

int x = DayOfWeek.Friday.ToInt();
Console.WriteLine(x); // 输出5,即Friday的整数值

在评论中某些情况下这个方法只适用于C# 3.0及更高版本。但实际测试中发现在VS2005中也可以正常工作。

public static class Helpers
{
    public static int ToInt(Enum enumValue)
    {
        return Convert.ToInt32(enumValue);
    }
}
static void Main(string[] args)
{
    Console.WriteLine(Helpers.ToInt(DayOfWeek.Friday));
}

某些情况下这个方法只适用于extension methods。在C# 2.0中尝试使用传统的函数形式,但无法找到传递任何值给它的语法。

如果想要一个真正的挑战,可以尝试从泛型类型参数TEnum转换为int类型。祝好运!

0
0 Comments

问题的原因是在将System.Enum转换为基本整数时,不能直接使用强制转换((int)enumValue)。这是因为System.Enum和Int32之间没有直接的继承关系,所以在类型系统中,显式转换是不正确的。此外,枚举可以具有不同的基础类型(int、long、byte等),所以直接强制转换也是“危险”的。

解决方法是使用Convert.ToInt32()来进行转换。这个方法可以将System.Enum转换为基本整数,而不需要进行显式的强制转换。这样可以避免在转换过程中出现类型不匹配的错误。

另外,如果底层类型与int不同(比如long类型的枚举),直接使用Convert.ToInt32()方法也不起作用。在这种情况下,需要使用专门针对不同底层类型的转换方法。

需要注意的是,由于System.Enum是一个类,所以它是引用类型,值可能被装箱。这意味着在进行转换时,需要注意处理装箱的情况。

总结起来,要将System.Enum转换为基本整数,可以使用Convert.ToInt32()方法来进行转换。如果底层类型不同,需要使用专门针对不同底层类型的转换方法。在进行转换时,需要注意处理装箱的情况。

0