C# int到枚举转换

C# int to enum conversion

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Cast int to enum in C#

如果我有以下代码:

1
2
3
4
5
6
7
8
9
10
11
enum foo : int
{
    option1 = 1,
    option2,
    ...
}

private foo convertIntToFoo(int value)
{
    // Convert int to respective Foo value or throw exception
}

转换代码是什么样子的?


把你的智力投给foo就好了:

1
2
int i = 1;
Foo f = (Foo)i;

如果您尝试强制转换一个未定义的值,它仍然可以工作。唯一的伤害可能来自于你以后如何使用这个值。

如果确实要确保在枚举中定义了值,可以使用Enum.IsDefined:

1
2
3
4
5
6
7
8
9
int i = 1;
if (Enum.IsDefined(typeof(Foo), i))
{
    Foo f = (Foo)i;
}
else
{
   // Throw exception, etc.
}

然而,使用isdefined的成本不仅仅是铸造。你使用哪一个取决于你的暗示。您可以考虑限制用户输入,或者在使用枚举时处理默认情况。

还要注意,不必指定枚举继承自int;这是默认行为。


我很确定你可以在这里做明确的演员。

1
foo f = (foo)value;

只要您说枚举继承(?)从Int,你有。

1
enum foo : int

edit yes结果是,默认情况下,枚举的基础类型是int。但是,您可以使用除char之外的任何整型。

也可以从不在枚举中的值进行强制转换,从而生成无效的枚举。我怀疑这仅仅通过改变引用的类型而不是实际改变内存中的值来实现。

枚举(C引用)枚举类型(C编程指南)


铸造就足够了。如果您使用的是C 3.0,那么您可以制作一个方便的扩展方法来解析枚举值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static TEnum ToEnum<TInput, TEnum>(this TInput value)
{
    Type type = typeof(TEnum);

    if (value == default(TInput))
    {
        throw new ArgumentException("Value is null or empty.","value");
    }

    if (!type.IsEnum)
    {
        throw new ArgumentException("Enum expected.","TEnum");
    }

    return (TEnum)Enum.Parse(type, value.ToString(), true);
}


1
2
3
4
if (Enum.IsDefined(typeof(foo), value))
{
   return (Foo)Enum.Parse(typeof(foo), value);
}

希望这有帮助

编辑在我的示例中,这个被投票定为值的答案是一个字符串,其中问题要求一个int。我的应用程序;下面应该更清楚一点:—)

1
2
3
4
5
6
Type fooType = typeof(foo);

if (Enum.IsDefined(fooType , value.ToString()))
{
   return (Foo)Enum.Parse(fooType , value.ToString());
}


你不需要遗产。你可以做到:

1
(Foo)1

它会起作用的;