是否存在Enum可能变得过于膨胀的程度?

Jon*_*han 2 c# asp.net-mvc enums model linq-to-sql

我已经将Enum定义为ASP.NET MVC应用程序的模型对象的一部分.

Enum被称为'ContentTypes',看起来像这样:

public enum ContentTypes
{
    [Description("News story")]
    NewsStory = 1,

    [Description("Article")]
    Article = 2
}
Run Code Online (Sandbox Code Playgroud)

现在我计划在名为"Route"的枚举项中添加另一组属性.此属性允许我将每个ContentType映射到可以处理它的URL.

所以在这之后我会:

public enum ContentTypes
{
    [Description("News story")]
    [Route("news/item/{URLName}")]
    NewsStory = 1,

    [Description("Article")]
    [Route("article/item/{URLName}")]
    Article = 2
}
Run Code Online (Sandbox Code Playgroud)

你觉得这个词汇的重量太大了吗?

将枚举项分解为类,然后给每个类一个"描述"和"路由"属性会更好吗?

Eri*_* J. 8

您真的尝试使用Enum来区分Content对象的多个变体,而不会遇到实际创建Content对象的多个版本的麻烦.

可以肯定的是,应用程序的行为将取决于枚举设置的内容.例如,您可能会遇到以下情况:

public Content
{
    private ContentTypes contentType;
    public string ToString()
    {
        switch (contentType)
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

从可维护性的角度来看,这会让你发疯.请考虑使用继承来获取您所追求的行为:

public Content
{
    public abstract string ToString();
}

public NewsStory : Content
{
    public override string ToString() { /* Appropriate formatting of output */ }
}

public Article : Content
{
    public override string ToString() { /* Appropriate formatting of output */ }
}
Run Code Online (Sandbox Code Playgroud)

现在要真正得到想象(并使用"按合同设计"方法),考虑任何内容的共同点并定义一个接口,例如IContent.如果你这样做,你可以做以下事情:

List<IContent> myContent;
foreach (IContent ic in myContent) ic.ToString();
Run Code Online (Sandbox Code Playgroud)