2

我正在寻找一种将不同选项作为参数传递给方法的方法。假设用户可以选择 6 个选项中的任何一个或全部或其中的任何子集。所以他可以选择所有选项,只有选项 1、2 和 4,只有选项 1、3、5 和 6 等等......

我如何有效地传递这个?

我正在考虑使用枚举,因为您可以进行按位加法,但我错过了从那里开始的下一个难题:

我的方法是否可以变成这样:

public void Foo(byte selectedOptions)
{
   // How do I check whether an option has been selected??
   if (selectedOptions >= Option.Whatever) DoThis();
}

所以你看我有点坚持按位比较,我想知道这是否是正确的方法......

我不想做的是:

public void Foo(bool option1Selected, bool option2Selected, etc...);

想法?

4

5 回答 5

6

使用枚举标志

[Flags]
public enum FlagTest
{
    None = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4
}

要选择多个选项,请使用按位或

FlagTest testItem = FlagTest.Flag1 | FlagTest.Flag2;

要检查是否选择了标志,请使用按位和

if ((testItem & FlagTest.Flag1) == FlagTest.Flag1)
{
     // Do something
}
于 2012-06-21T10:03:28.010 回答
1

用户参数关键字:

public void Foo(params string[] options);

然后您可以将无限的字符串参数传递给函数,并在 string[] 数组中读取它们。

或使用枚举(恕我直言,这是更好的方法):

[Flags]
public enum MyEnum {
    Value1 = 1,
    Value2 = 2,
    Value3 = 4,
    Value4 = 8,
    Value5 = 16,
    Value6 = 32,
}
public void Foo(MyEnum value){
    if (value & MyEnum.Value1 > 0){
        // we have Value1 passed
    }
}

并将其称为:

Foo(MyEnum.Value1 | MyEnum.Value4 | MyEnum.Value10);

枚举值不应该是连续的 - 像 1,2,3,4,5,但标志值 - 2^x。

于 2012-06-21T10:01:41.927 回答
0

你想和你的旗帜

public void Foo(Option selectedOptions) 
{
  if ((selectedOptions & Option.Whatever)>0) 
  {
     // whatever
  }
}

你还应该用[Flags]

例如:

[Flags]
public enum Option
于 2012-06-21T10:02:45.170 回答
0

传统上,有几种方法可以实现您所描述的。第一个是定义一个结构:

public class FooOptions
{
    bool Fizz;
    bool Buzz;
    bool Boom;
}

...然后您的方法的调用者将传递一个实例,并将相应的字段设置为 true。

标志枚举是另一种解决方案:

public enum FooOptions
{
    Fizz = 1,
    Buzz = 2,
    Boom = 4,
}

...然后您将使用以下内容进行测试:

if ((options & FooOptions.Fizz) == FooOptions.Fizz) { ... }

然而,如今,C# 具有可选和命名参数,这意味着您的最终方法(您不想做的那个)将是最明智的:

public void Foo(bool fizz = false, bool buzz = false, bool boom = false)
{
    ...
}

...然后您可以使用任何参数排列来调用它,例如:

Foo(fizz: true, boom: true);
Foo(buzz: true);
于 2012-06-21T10:04:51.527 回答
0

您可以使用HashSet<YourEnum>来保存一组选项。

public void Foo(HashSet<YourEnum> selectedOptions)
{
    if(selectedOptions.Contains(YourEnum.Option1))
        DoSomething();
}

使用 justenum很好,但对我来说,Contains()方法是测试选项的更具可读性的方式。

于 2012-06-21T10:06:41.347 回答