【问题标题】:Pass Multiple Enum Values To Method将多个枚举值传递给方法
【发布时间】:2013-06-04 12:23:04
【问题描述】:

我有一个这样的枚举和一个函数

        enum DaysOfWeek
        {
           Sunday = 1,
           Monday = 2,
           Tuesday = 4,
           Wednesday = 8,
           Thursday = 16,
           Friday = 32,
           Saturday = 64
        }

        public void RunOnDays(DaysOfWeek days)
        {
           // Do your work here..
        }

    // Im Calling The Function like this and passing the parameters with Pipe Seprated
       RunOnDays(DaysOfWeek.Tuesday | DaysOfWeek.Thursday);

现在场景在我的用户界面中,我有一些复选框,例如周一到周日,用户可以选择所有天或至少选择一个。我想将选定的值传递给我的函数 RunOnDays。所以它可以是单个值或多个值。如何在选择用户时将值动态传递给该方法。

【问题讨论】:

  • 用 [Flags] 属性标记你的枚举
  • 已经有DayOfWeek枚举了,你为什么要重新发明轮子?
  • 您已经展示了如何将“多值”值传递给方法......那么问题是什么?
  • @TimSchmelter 好吧,我猜现有的不是 [Flags],所以你不能合并这些日子。
  • @MatthewWatson:你说得对,我知道 OP 的代码来自哪里:stackoverflow.com/a/1030091/284240

标签: c# enums


【解决方案1】:

在你的枚举中使用[Flags] 属性

[Flags]
enum DaysOfWeek
{
   Sunday = 1,
   Monday = 2,
   Tuesday = 4,
   Wednesday = 8,
   Thursday = 16,
   Friday = 32,
   Saturday = 64
}

public void RunOnDays(DaysOfWeek days)
{
           // Do your work here..
}

【讨论】:

  • Flags 属性应该应用于枚举,而不是参数。
  • 好的。现在虽然这更好,但它实际上并不是必要的 - 我相信只是改变ToStringParse 所做的事情。 OP 似乎已经知道如何使用| 创建复合值,所以实际上并不清楚问题是什么......但我怀疑这并不能解决它。
【解决方案2】:

通过List<T>IEnumerable<T> 传递它们更容易。

public void RunOnDays(IEnumerable<DaysOfWeek> days)
{
    // do something amazing
}

public void DoWork()
{
    var days = new List<DaysOfWeek>();

    // put each checked day into days

    RunOnDays(days);
}

编辑:如果我正确理解您的帖子,您是在问如何将| 运算符动态应用于不确定的枚举列表,对吗?如果 RunOnDays 定义在不可修改的 DLL 中,您首先需要知道它是否支持复合枚举。如果是这样,您仍然可以使用 IEnumerable 方法并通过迭代进行组合。

DaysOfWeek checkedDays;

foreach (var day in days)
{
    checkedDays |= day;
}

RunOnDays(checkedDays);

【讨论】:

  • 我有一些 DLL,在那个 DLL 中定义了方法和枚举。我无权将枚举更改为标志或更改方法。在我的用户界面中,我有一些复选框,它们具有一些值,例如。星期日、星期一、星期六、星期五等。因此,将检查哪个复选框我必须将其作为参数传递给 |正如我在问题中提到的那样。
  • 我不确定你在问什么。 RunOnDays 是您的方法还是库中定义的方法?您的帖子的哪一部分有问题?
  • 那么请先阅读我的问题。
【解决方案3】:

好的,我不完全确定你需要知道什么,但我会猜测一下。

假设您每天有一个复选框,称为mondayCheckboxtuesdayCheckbox 等等。

现在您想要获得一个 int 值,该值表示选中了哪些复选框。

你可以这样做:

DaysOfWeek days = 0;

if (mondayCheckbox.Checked)
    days |= DaysOfWeek.Monday;

if (tuesdayCheckbox.Checked)
    days |= DaysOfWeek.Tuesday;

... And so on up to:

if (sundayCheckbox.Checked)
    days | = DaysOfWeek.Sunday;

if (days != 0)
{
    RunOnDays(days);
}
else
{
    // Handle no days selected.
}

我认为您还应该在您的 DaysOfWeek 枚举中添加一个 None

[Flags]
enum DaysOfWeek
{
   None   = 0,
   Sunday = 1,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    • 2017-01-06
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多