Lookup类使用enum,struct,public const,还有别的吗?

时间:2010-11-29 10:16:56

标签: c# dictionary constants lookup

我正在创建一个查找类,因此将在所有项目中使用常量值。 问题是,有几种解决方案可以创造这样的东西。我可以创建一个包含枚举,结构或常量的单个类,或者为每个“对象”创建一个类。我想知道什么是最好的解决方案。

首先我想做这样的事情:

public static class Defines
    {
        public enum PAGELAYOUT_NAMES
        {
            STANDARD = "Standard"
        }
    }

但我个人不喜欢在枚举中使用字符串。 另一个选择是使用一个结构,如果你看到代码,那就更难看了:

public static class Defines
    {
        public struct PAGELAYOUT_NAMES
        {
            public static string STANDAARD = "Standaard";
        }
    }

这看起来好一些,但在有很多选择时可能会让人感到困惑:

public static class Defines
{
        public const string PAGELAYOUT_NAMES_STANDARD = "Standard";
}

在输入这篇文章时,我认为这将是最好的/干净的选择:

public static class PageLayout
{
    public const string STANDARD = "Standard";
}

还有其他建议吗? 使用几个只定义一些常量的类来填充项目在我看来似乎有很多开销和混乱。

修改 在原始上下文中不是很清楚,但查找值不仅限于字符串。下面的一些非常好的建议只有在您只使用字符串时才有可能,但也需要支持Int,DateTime和其他类型。从这里的答案中得到了一些不错的想法,我将尝试哪一个在我当前的项目中效果最好。

最终实施的解决方案 感谢下面的建议,我已经实现了这样的查找类:

 internal class Base<T>
    {
        internal T Value{ get; private set;}
        internal Base(T value)
        {
            Value = value;
        }
    }
    public class PageLayout
    {
        public static string Standard { get { return new Base<string>("Standard").Value; } }
    }

这是基于下面给出的答案。 原因是因为现在我可以将它用于非字符串&amp;整数也是如此,对于带有描述和资源文件的枚举来说这是不可能的,即使这对我来说也会更清晰。

4 个答案:

答案 0 :(得分:4)

根据您正在做的具体情况,您可能希望查看Resources

您定义了一个xml文件(或使用设计器来帮助您),并将其编译为程序集(嵌入式或“附属程序集”)。

右键单击解决方案资源管理器中类库下的属性节点,单击“打开”,然后转到资源选项卡。从那里开始很简单。

一旦设置好,就很容易从代码中获取值: -

String s = Resources.PageLayoutNames.Standard;

有一些并发症,但如果不了解您的应用程序,我无法提供更多建议。想到的是,如果您要对ASP.NET应用程序进行单元测试,则需要确保资源嵌入而不是作为卫星部署,否则单元测试不起作用。

它们也被用于全球化,所以熟悉它们是很好的。


修改

在再次阅读你的问题之后,我倾向于问“你需要什么字符串?”。

你做什么只是一个枚举你不能做什么?

enum PageLayouts
{
  Standard,
  ExtraAwesome
}

如果您正在尝试将显示的文本映射到枚举类型,那么有很多方法可以做到这一点,例如: using the DescriptionAttribute

enum PageLayouts
{
   [Description("Standard")]
   Standard,
   [Description("Extra Awesome")]
   ExtraAwesome
}

但是,您无法为DescriptionAttribute提供开箱即用的资源键。 You have to subclass it if you want to support globalisation...

答案 1 :(得分:2)

我更喜欢使用工厂样式的静态属性。但这取决于确切的情况。您可以使用字符串或枚举作为字段。

 public class PageLayout
    {
        private readonly string LayoutType;
        private PageLayout(string layoutType)
        {
          LayoutType = layoutType;
        }
        public static Standard {get {return new PageLayout("Standard");}}
    }

然后在调用代码时使用PageLayout.Standard

答案 2 :(得分:0)

人们建议不要使用公共嵌套类,因此在前面的示例中,Defines应该是命名空间而不是外部类。

答案 3 :(得分:0)

我总是使用

public static class PageLayout 
{ 
    public const string STANDARD = "Standard"; 
} 

方法

然而,我确实创建了更多的类:当我使用大量的会话变量时,我创建了一个(公共静态)

class SessionNames

我确实在灵魂宽度常数和项目范围常量之间做出了区别。

有时一个项目的常量(例如你必须创建的PDF中的20个占位符)与其他项目无关,所以我将它作为一个项目类,但当我有解决方案范围的常量时,我​​创建了一个类与我放置字符串扩展名等相同的地方。