2010-10-06 56 views
0

我有以下枚舉:C# - 幫助與[國旗]枚舉和擴展方法

[Flags] 
public enum PostAssociations 
{ 
    None = 0x0, 
    User = 0x1, 
    Comments = 0x2, 
    CommentsUser = 0x3 
} 

一開始的音符,即時通訊不知道這些標誌是正確的。

我這樣做,以便我有一個流利的方式來定義實體框架的「包含」(因爲EF包含方法需要一個字符串,我不想暴露給用戶界面)。

所以我想它,所以我的服務層可以接受PostAssociations,並在我的服務層我利用擴展方法將其轉換爲字符串[]。 (我的回購然後分裂爲了做包括)。

我沒有用Flags Enum做很多事情,所以我爲我的無知道歉。 :)

這是一個「真值表」什麼,我想(枚舉值,變換的串[])

None = null 
User = new string[] { "User" } 
Comments = new string[] { "Comments" } 
User, Comments = new string[] { "User", "Comments" } 
Comments, CommentsUser = new string[] { "Comments", "Comments.User" } 
User, Comments, CommentsUser = new string[] { "User", "Comments", "Comments.User" } 

不能有CommentsUser沒有評論。

所以我需要三樣東西幫助:

  1. 如何設置枚舉匹配真值表?
  2. 如何爲這些示例之一調用服務層?
  3. 如何編寫擴展方法將該枚舉轉換爲字符串數組?

當然,如果你們可以想出一個更好的方式來做我即將做的事情,我也會考慮。本質上,我試圖掩蓋EF後面的Enum的「魔術字符串」,考慮到你可以做多個包含(或沒有),我認爲這是Flags Enum的一個好例子。

謝謝你們。

+0

好,首先,'0x3'絕對不是** **正確的值,除非你的意思是'CommentsUser'代表'User'和'Comments'之間的聯合,我懷疑你實際上並不想要。 – 2010-10-06 00:24:01

+0

你是什麼意思,你不能評論用戶沒有評論? – 2010-10-06 00:24:52

+0

@Kirk Woll - 不,那不是我想要的。正如我所說,我沒有使用枚舉標誌的經驗 - 我不知道標誌使用什麼值。在這個階段,我要和一系列PostAssociations(而不是標誌)一起去,除非有人想出答案。 – RPM1984 2010-10-06 00:25:44

回答

0

我的壞人,我用旗枚舉經驗不足導致了一個令人困惑的問題。

我的場景對標誌enum無效。

相反,我選擇使用PostAssociations []。

我的服務層:

public Post FindSingle(int postId, PostAssociations[] postAssociations) 
{ 
    return repo.Find(postAssocations.ToEfInclude()).WithId(postId); 
} 

擴展方法:

public static string[] ToEfInclude(this PostAssociations[] postAssocations) 
{ 
    if (postAssocations == null) return null; 

    List<string> includeAssociations = new List<string>(); 

    if (postAssocations.Contains(PostAssociations.User)) 
     includeAssociations.Add("User"); 
    if (postAssocations.Contains(PostAssociations.Comments)) 
    { 
     if (postAssocations.Contains(PostAssociations.CommentsUser)) 
     { 
      includeAssociations.Add("Comments.User"); 
     } 

     includeAssociations.Add("Comments"); 
    } 

    return includeAssociations.ToArray(); 
} 

用法:

PostAssociations[] associations = new[] { PostAssociations.Comments, PostAssociations.User, PostAssociations.CommentsUser };  
return service.Find(1, associations); 
+0

可用性您的FindSingle()方法可以實現爲FindSingle(int id,params PostAssociations [] args) – cordialgerm 2010-10-06 02:21:21

3

當你創建標誌枚舉:

[Flags] 
public enum PostAssociations 
{  
    None = 0x0, 
    User = 0x1, 
    Comments = 0x2, 
    CommentsUser = User|Comments, 
} 

會更有意義。在你目前的代碼中,我不明白你想達到什麼目的。

否則,我不認爲你需要一個基於標誌枚舉在所有...

+1

是的,我不認爲我應該在這裏使用國旗枚舉。你提出的建議是有道理的,但不是在我的情況下(因爲我沒有正確解釋它)。 CommentsUser是一個單獨的值(不是用戶+評論)。所以我不認爲我應該使用標誌。我要堅持PostAssociations []。 – RPM1984 2010-10-06 00:28:05

+1

假設它們是兩個冪,您可以在任何枚舉上使用按位運算符。你不需要flags屬性,除非你想讓ToString很好地工作(還有一些其他的功能,但我不記得)。 – 2010-10-06 00:41:29