Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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#_Dictionary_Constants_Lookup - Fatal编程技术网

C# 查找类是否使用枚举、结构、公共常量或其他内容?

C# 查找类是否使用枚举、结构、公共常量或其他内容?,c#,dictionary,constants,lookup,C#,Dictionary,Constants,Lookup,我正在创建一个lookup类,以便在所有项目中使用常量值。 问题是,有几种解决方案可以创造这样的东西。我可以创建一个包含枚举、结构或常量的类,或者为每个“对象”创建一个类。我想知道什么是最好的解决办法 首先我想做这样的事情: public static class Defines { public enum PAGELAYOUT_NAMES { STANDARD = "Standard" } } inte

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

首先我想做这样的事情:

public static class Defines
    {
        public enum PAGELAYOUT_NAMES
        {
            STANDARD = "Standard"
        }
    }
 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; } }
    }
但就我个人而言,我不太喜欢在枚举中使用字符串。 另一种选择是使用struct,如果您看到以下代码,它会更难看:

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和其他类型。从这里的答案中得到了一些不错的想法,我将尝试在我当前的项目中哪一个效果最好

最终实施的解决方案 由于下面的建议,我实现了如下查找类:

public static class Defines
    {
        public enum PAGELAYOUT_NAMES
        {
            STANDARD = "Standard"
        }
    }
 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; } }
    }
内部类基类
{
内部T值{get;private set;}
内底(T值)
{
价值=价值;
}
}
公共类页面布局
{
公共静态字符串标准{get{返回新基(“标准”).Value;}
}
这是基于下面给出的答案。
原因是,现在我也可以将其用于非字符串和整数,这在带有描述和资源文件的枚举中是不可能的,尽管这对我来说会更干净。

根据您正在执行的具体操作,您可能需要查看

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

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

设置后,很容易从代码中获取值,例如:-

String s = Resources.PageLayoutNames.Standard;
这里有一些复杂的情况,但如果不了解更多关于你的应用程序的信息,我无法给出更多建议。我想到的一个问题是,如果您正在对ASP.NET应用程序进行单元测试,则需要确保资源被嵌入而不是作为卫星部署,否则单元测试将无法工作

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


编辑:

或者,在再次阅读你的问题之后,我倾向于问“你到底需要这个字符串做什么?”

你在做什么,你不能只用一个枚举

enum PageLayouts
{
  Standard,
  ExtraAwesome
}
如果您试图将要显示的文本映射到枚举类型,有很多方法可以实现这一点,例如


但是,您不能为DescriptionAttribute提供现成的资源密钥

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

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

 public class PageLayout
    {
        private readonly string LayoutType;
        private PageLayout(string layoutType)
        {
          LayoutType = layoutType;
        }
        public static Standard {get {return new PageLayout("Standard");}}
    }
然后在调用代码时使用
PageLayout.Standard
我总是使用

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

然而,我确实创建了不止一个的类:当我使用大量sessionvariables时,我创建了一个(publicstatic)

我确实在soultion范围的常量和项目范围的常量之间做了区别


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

如果使用“const”,您需要非常小心价值观它们被编译为引用程序集的文本。这意味着如果常量值发生更改,则需要重新编译所有DLL,而不仅仅是包含更改常量的DLL。请看这里的注释:-尽管我喜欢Iain Galloway的建议的简洁性,但我已经实现了这一点,因为您还可以添加非字符串和整数值,如GUID、DateTime等。