C # - Помощь с [Flags] Перечисление и метод расширения - PullRequest
0 голосов
/ 06 октября 2010

У меня есть следующее перечисление:

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

В качестве начального замечания я не уверен, верны ли эти флаги.

Я делаю это так, чтобы у меня был свободный способ определения «Включений» для Entity Framework (поскольку метод EF Include принимает строку, которую я не хочу показывать в пользовательском интерфейсе).

Итак, я хочу, чтобы мой сервисный уровень мог принимать PostAssociations , а в моем сервисном слое я использую метод расширения, чтобы преобразовать это в строку []. (который затем разделяет мой репо, чтобы сделать .Include).

Я не так много сделал с Flags Enum, поэтому прошу прощения за свое невежество. :)

Это «таблица истинности» того, что я хочу (значение 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" }

Не может иметь КомментариевПользователь без Комментариев.

Так что мне нужна помощь с тремя вещами:

  1. Как настроить enum в соответствии с таблицей истинности?
  2. Как мне вызвать сервисный уровень для одного из этих примеров?
  3. Как мне написать метод расширения для преобразования этого перечисления в массив строк?

Конечно, если вы, ребята, можете придумать лучший способ сделать то, что я пытаюсь сделать, я тоже это учту. По сути, я пытаюсь замаскировать «магические струны» EF Include за Enum, и учитывая, что вы можете сделать несколько включений (или ни одного), я подумал, что это хороший пример для Engs Flags.

Спасибо, ребята.

Ответы [ 2 ]

3 голосов
/ 06 октября 2010

, если вы создали перечисление с флагами:

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

это будет иметь больше смысла. В вашем текущем коде я не понимаю, чего вы пытаетесь достичь.

в противном случае, я не думаю, что вы вообще хотите использовать перечисление на основе флага ...

0 голосов
/ 06 октября 2010

Мои плохие парни, моя неопытность с перечислением флагов привела к запутанному вопросу.

Мой сценарий недопустим для перечисления флагов.

Вместо этого я решил использовать 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);
...