2013-06-04 102 views
-1

我有一個枚舉像這樣傳遞多個枚舉值的方法

 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); 

一個函數現在場景在我的UI我有一些複選框像週一至週日,用戶可以選擇所有天或至少可以選擇一。我想將選定的值傳遞給我的函數RunOnDays。所以它可以是單個值或許多值。如何在選擇用戶時動態地將值傳遞給該方法。

+5

標記你的枚舉用[旗]屬性 – Giedrius

+0

不過已經有了[ 'DayOfWeek'](http://msdn.microsoft.com/en-us/library/system.dayofweek.aspx)枚舉,你爲什麼重新發明輪子? –

+1

而你已經展示了你是如何將「多重價值」價值傳遞給該方法的......所以問題是什麼? –

回答

3

將它們傳遞給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); 
+0

我有一些DLL,並在該DLL中定義了該方法和枚舉。我無權將枚舉更改爲標誌或更改方法。在我的UI中,我有一些複選框具有一些值。星期日,星期一,星期六,星期五等等。所以選中哪個複選框我必須將其作爲參數與|分開正如我在我的問題中提到的。 –

+0

我不確定你在問什麼。 'RunOnDays'是你的方法還是庫中定義的方法?你的帖子的哪個部分是你遇到問題? –

+0

然後請首先閱讀我的問題。 –

5

使用[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.. 
} 
+1

「Flags」屬性應該應用於枚舉,而不是參數。 –

+0

@JonSkeet固定....太倉促:) –

+1

好的。現在雖然這樣更好,但它實際上並不是必須的* - 我相信只是改變了'ToString'和'Parse'的作用。 OP似乎已經知道如何使用'|'創建複合值,所以實際上並不清楚問題的關鍵......但我懷疑這並不能解決問題。 –

1

好吧,我不完全相信你需要知道什麼,但我將有一個猜測。

假設您每天有一個複選框,名爲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. 
} 

我想你也應該添加一個NoneDaysOfWeek枚舉:

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