Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一个枚举会变得过于膨胀的点?_C#_Asp.net Mvc_Linq To Sql_Enums_Model - Fatal编程技术网

C# 是否有一个枚举会变得过于膨胀的点?

C# 是否有一个枚举会变得过于膨胀的点?,c#,asp.net-mvc,linq-to-sql,enums,model,C#,Asp.net Mvc,Linq To Sql,Enums,Model,我已经将枚举定义为ASP.NET MVC应用程序模型对象的一部分 枚举称为“ContentTypes”,其外观如下所示: public enum ContentTypes { [Description("News story")] NewsStory = 1, [Description("Article")] Article = 2 } [Description("x"), Route("y")] 现在,我计划向名为“Route”的枚举项添加另一组属性。此

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

枚举称为“ContentTypes”,其外观如下所示:

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

    [Description("Article")]
    Article = 2
}
[Description("x"), Route("y")] 
现在,我计划向名为“Route”的枚举项添加另一组属性。此属性允许我将每个ContentType映射到可以处理它的URL

因此,在此之后,我将:

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

    [Description("Article")]
    [Route("article/item/{URLName}")]
    Article = 2
}
您认为枚举在这一点上变得太重了吗


是否最好将枚举项分解为(比如)类,然后为每个类赋予“Description”和“Route”属性?

我个人认为枚举应该保持简单。在这里,不仅仅是一个助记符,我会考虑Fowler的“替换类型代码的状态/策略模式”。
因此,是的,我将转换为一个类。

您可以组合属性,使其看起来更像这样:

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

    [Description("Article")]
    Article = 2
}
[Description("x"), Route("y")] 

如果你认为语法看起来更好。但是我同意Mitch的观点,这些类可能会做得更好,特别是如果将来可能需要添加另一个属性的话。

您实际上是在尝试使用枚举来区分内容对象的多个变体,而不需要实际创建内容对象的多个版本

应用程序的行为很可能取决于枚举的设置。例如,您可能有如下内容:

public Content
{
    private ContentTypes contentType;
    public string ToString()
    {
        switch (contentType)
        ...
    }
}
从可维护性的角度来看,这会让你发疯。而是考虑使用继承来获得您正在进行的行为:

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 */ }
}

现在要真正想起来(使用合同设计的方法),考虑任何内容都有共同点的东西,并定义一个接口,例如图标。如果你这样做,你可以做如下事情:

List<IContent> myContent;
foreach (IContent ic in myContent) ic.ToString();
列出myContent;
foreach(myContent中的IContent ic)ic.ToString();