【问题标题】:Converting a method argument into an enum [duplicate]将方法参数转换为枚举
【发布时间】:2013-08-25 07:46:40
【问题描述】:

我有一个这样定义的枚举类型:

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

【问题讨论】:

  • 为什么不直接运行代码并找出答案。
  • @Kaf 可能的原因:他使用的数据库支持int,但不支持enum
  • 是的,它会起作用的。但是,最好先检查 int 是否在声明的枚举范围内。
  • 我运行了代码...编译器没有抱怨。当传入不在枚举中的值时会发生什么?
  • @sirbombay 你应该可以很容易地尝试一下......

标签: c# .net enums


【解决方案1】:

是的,您可以直接从 int 转换为 enum(假设存在该整数的 enum 表示形式)。

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

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

【讨论】:

  • 当它不存在时会发生什么?
  • 被分配的变量恢复为int - 这两种类型可以互换,因此您不会遇到异常。
【解决方案2】:

你当然可以这样做。试试看吧。

你也可以用其他方式投射

(int)Account.Status

可以将 Enum 转换为 int ,反之亦然,因为每个 Enum 实际上默认都由一个 int 表示。您应该手动指定成员值。默认从 0 到 N 开始。

如果你尝试转换一个不存在的枚举值,它会起作用,但如果你尝试将它与枚举中的任何值进行比较,它不会给你一个枚举值

【讨论】:

  • 我真的试过了..它编译得很好。但我担心的是当传入一个枚举中不存在的值时会发生什么?
  • @sirbombay 你可以试试 2 :)
  • @sirbombay 阅读我编辑的答案
  • 现在说得通了……我想我自己也应该知道了 :)
【解决方案3】:

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

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 的 de else 中抛出异常。

【讨论】:

  • 我想这就是我一直在寻找的魔法......谢谢
  • Enum.IsDefined 已经这样做了 - 请参阅我的答案。
  • @James,好吧,创建这个方法很有趣,但没有必要......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-21
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多