C# - 帮助[Flags] Enum&扩展方法

时间:2010-10-06 00:06:06

标签: c# enums extension-methods flags enum-flags

我有以下枚举:

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

作为开始注释,我不确定这些标志是否正确。

我这样做是为了让我有一种流畅的方式为Entity Framework定义“包含”(因为EF Include方法需要一个字符串,我不想暴露给UI)。

所以我想要它,所以我的服务层可以接受 PostAssociations ,在我的服务层我使用扩展方法将其转换为字符串[]。 (我的回购然后拆分以便进行.Include)。

我对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" }

没有评论就没有评论用户。

所以我需要三件事的帮助:

  1. 如何设置枚举以匹配真值表?
  2. 如何为其中一个示例调用服务层?
  3. 如何编写扩展方法将该枚举转换为字符串数组?
  4. 当然,如果你们想到一个更好的方式来做我想做的事情,我也会考虑到这一点。基本上我正试图掩盖EF Enlude在Enum后面的“魔法字符串”,考虑到你可以做多个包含(或者没有),我认为这是一个标志枚举的好例子。

    谢谢你们。

2 个答案:

答案 0 :(得分:3)

如果您使用flags创建枚举:

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

这会更有意义。在您当前的代码中,我不明白您要实现的目标。

否则,我认为你根本不想要基于标志的枚举......

答案 1 :(得分:0)

我的坏人,我对标志枚举的经验不足导致了一个令人困惑的问题。

我的方案对于标志枚举无效。

相反,我选择使用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);