[英]Lookup class use enum, struct, public const, something else?
我正在创建一个查找类,因此将在所有项目中使用一个恒定值。 问题是,有几种解决方案可以创建这样的事物。 我可以创建一个包含枚举,结构或常量的类,也可以为每个“对象”创建一个类。 我想知道什么是最好的解决方案。
首先,我想做这样的事情:
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; } }
}
这是基于以下给出的答案。 原因是因为现在我也可以将其用于非字符串和整数,这对于带有描述和资源文件的枚举实际上是不可能的,即使这对我来说更干净。
根据您正在执行的操作,您可能需要查看Resources 。
您定义一个xml文件(或使用设计器为您提供帮助),然后将其编译为一个程序集(嵌入式程序集或“卫星程序集”)。
在解决方案资源管理器中的类库下,右键单击属性节点,单击“打开”,然后转到资源选项卡。 从那里开始很简单。
设置完成后,很容易从代码中获取值,例如:
String s = Resources.PageLayoutNames.Standard;
有一些复杂性,但是如果不了解您的应用程序,我将为您提供更多建议。 想到的是,如果您要对ASP.NET应用程序进行单元测试,则需要确保将资源嵌入而不是作为卫星进行部署,否则单元测试将无法正常工作。
它们也用于全球化,所以熟悉它们是一件好事。
编辑:
或者,在再次阅读您的问题之后,我倾向于问“您到底需要什么字符串?”。
您正在做什么,用枚举不能做到?
enum PageLayouts
{
Standard,
ExtraAwesome
}
如果您尝试将要显示的文本映射为枚举类型,则可以使用多种方法来实现,例如通过使用DescriptionAttribute
enum PageLayouts
{
[Description("Standard")]
Standard,
[Description("Extra Awesome")]
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
人们建议不要使用公共嵌套类,因此在前面的示例中, Defines
应该是名称空间而不是外部类。
我总是用
public static class PageLayout
{
public const string STANDARD = "Standard";
}
方法。
但是,我确实创建了一个以上的类:当我使用大量会话变量时,我创建了一个(公共静态)
class SessionNames
我确实在灵魂宽范围常量和项目宽范围常量之间有所不同。
有时一个项目的常量(例如,您必须在PDF中创建20个占位符)与其他项目无关,所以我将其设为一个项目类,但是当我拥有解决方案范围的常量时,我会在同一位置创建一个类当我把我的字符串扩展名等
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.