将方法参数转换为枚举类型

6

我有一个枚举类型定义如下:

public enum Status
{
    Active=1,
    InActive=0
}

在我的方法中,我可以像这样将参数转换为枚举吗:

public string doSomething(string param1, int status)
{
//will this work?      
Account.Status = (Status) status;
//or do i need to test one by one like this
if(status == 0)
{
 Account.Status = Status.Inactive;
 //and so on...
} // end if
}  // end doSomething

4
为什么不直接运行代码,看看结果呢? - Magnus
@Kaf 可能的原因是:他正在使用支持 int 但不支持 enum 的数据库。 - Nolonar
是的,它会起作用。然而,最好先检查int是否在声明的枚举范围内。 - VsMaX
1
@sirbombay,你应该很容易自己尝试一下... - Magnus
因为它在 Web 服务内部,所以没有借口,我会自己找出来的。谢谢大家,包括那些愤怒地投了反对票的人 :) - sirbombay
显示剩余2条评论
3个回答

2

如果存在 enum 表示该整数,您可以直接从 int 强制转换为 enum

如果需要在解析之前检查是否存在该 enum,请使用 Enum.IsDefined,例如:

if (Enum.IsDefined(typeof(Status), status))
{
    Account.Status = (Status)status;
}

当它不存在时会发生什么? - sirbombay
被赋值的变量会回归到 int - 这两种类型是可互换的,因此您不会得到异常。 - James

1

只需检查 int 是否为状态的有效值,然后进行转换。

public string doSomething(string param1, int status)
{
    if (IsValidEnum<Status>(status))
    {
        Account.Status = (Status)status;
    }
    ...
}

private bool IsValidEnum<T>(int value)
{
    var validValues = Enum.GetValues(typeof(T));
    var validIntValues = validValues.Cast<int>();
    return validIntValues.Any(v => v == value);
}

在if语句的else部分,如果您希望可以抛出异常。

我想这就是我一直在寻找的魔法...谢谢。 - sirbombay
Enum.IsDefined 已经实现了这个功能 - 请参考我的回答。 - James
@James,好的,创建这个方法很有趣,但是不必要... - Alex Siepman

1
当然可以做到。试一试就知道了。
你也可以反过来投射。
(int)Account.Status

可以将枚举类型转换为整型,反之亦然,因为每个枚举类型默认都由一个整数表示。您应该手动指定成员值。默认情况下,它从0到N开始。

如果尝试转换不存在的枚举值,则会成功,但如果尝试将其与枚举中的任何值进行比较,则无法获得枚举值。


我实际上已经尝试过了,编译也很顺利。但我的担心是,如果传入枚举中不存在的值会发生什么? - sirbombay
@sirbombay 你也可以试试这个2 :) - No Idea For Name
@sirbombay,请查看我编辑过的答案。 - No Idea For Name
现在我明白了...我想我应该自己找出来 :) - sirbombay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接