C#int枚举转换

TK.*_*TK. 54 c# enums

可能重复:
在C#中将int转换为枚举

如果我有以下代码:

enum foo : int
{
    option1 = 1,
    option2,
    ...
}

private foo convertIntToFoo(int value)
{
    // Convert int to respective Foo value or throw exception
}
Run Code Online (Sandbox Code Playgroud)

转换代码会是什么样的?

Jon*_*n B 117

将你的int转换为Foo是好的:

int i = 1;
Foo f = (Foo)i;
Run Code Online (Sandbox Code Playgroud)

如果您尝试转换未定义的值,它仍然可以工作.可能由此产生的唯一伤害在于您以后如何使用该值.

如果你真的想确保你的值是在enum中定义的,你可以使用Enum.IsDefined:

int i = 1;
if (Enum.IsDefined(typeof(Foo), i))
{
    Foo f = (Foo)i;
}
else
{
   // Throw exception, etc.
}
Run Code Online (Sandbox Code Playgroud)

但是,使用IsDefined的成本不仅仅是投射.您使用哪个取决于您的实施.您可以考虑在使用枚举时限制用户输入或处理默认情况.

另请注意,您不必指定您的枚举继承自int; 这是默认行为.


Cam*_*and 16

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

foo f = (foo)value;
Run Code Online (Sandbox Code Playgroud)

只要你说enum从int继承(?),你就拥有了.

enum foo : int
Run Code Online (Sandbox Code Playgroud)

编辑是的,事实证明,默认情况下,枚举基础类型是int.但是,您可以使用除char之外的任何整数类型.

你也可以从一个不在枚举中的值进行转换,产生一个无效的枚举.我怀疑这只是改变引用的类型而不是实际改变内存中的值.

枚举(C#参考)
枚举类型(C#编程指南)


Wes*_*olf 5

if (Enum.IsDefined(typeof(foo), value))
{
   return (Foo)Enum.Parse(typeof(foo), value);
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

编辑 这个答案在我的例子中被投票为值是一个字符串,而问题要求一个整数。我的应用程序;以下应该更清楚一点:-)

Type fooType = typeof(foo);

if (Enum.IsDefined(fooType , value.ToString()))
{
   return (Foo)Enum.Parse(fooType , value.ToString());
}
Run Code Online (Sandbox Code Playgroud)


wei*_*ran 5

铸造应该足够了.如果你正在使用C#3.0,你可以使用一个方便的扩展方法来解析枚举值:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我更愿意将if(value == null)语句更改为if(value == default(TInput)). (2认同)