【发布时间】:2010-10-06 00:06:06
【问题描述】:
我有以下枚举:
[Flags]
public enum PostAssociations
{
None = 0x0,
User = 0x1,
Comments = 0x2,
CommentsUser = 0x3
}
首先,我不确定这些标志是否正确。
我这样做是为了有一种流畅的方式来定义实体框架的“包含”(因为 EF Include 方法需要一个字符串,我不想将它暴露给 UI)。
所以我想要它,以便我的服务层可以接受 PostAssociations,并且在我的服务层中,我利用扩展方法将其转换为字符串 []。 (然后我的 repo 将其拆分以执行 .Include)。
我对 Flags Enum's 做的不多,所以我为我的无知道歉。 :)
这是我想要的“真值表”(枚举值,转换后的字符串 [])
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" }
不能有没有评论的评论用户。
所以我需要三件事的帮助:
- 如何设置枚举以匹配该真值表?
- 对于这些示例之一,我如何调用服务层?
- 如何编写扩展方法将该枚举转换为字符串数组?
当然,如果你们能想出更好的方法来做我想做的事,我也会考虑的。本质上,我试图掩盖 Enum 后面的 EF Include 的“魔术字符串”,并且考虑到您可以执行多个包含(或不包含),我认为这对于 Flags Enum 来说是一个很好的案例。
谢谢大家。
【问题讨论】:
-
嗯,首先,
0x3绝对不是正确的值,除非您的意思是CommentsUser代表User和Comments之间的联合我怀疑你实际上不想要。 -
什么意思,没有cmets就不能有cmetsuser?
-
@Kirk Woll - 不,这不是我想要的。正如我所说,我没有使用枚举标志的经验 - 我不知道标志使用什么值。在这个阶段,除非有人想出答案,否则我会使用一系列 PostAssociations(而不是标志)。
-
@John Gardner - 正确。除非还提供了“Comments”,否则无法提供“Comments.User”(因为 .User 是 .Comments 的子集)。
标签: c# enums extension-methods flags enum-flags