【问题标题】:How to replace/override a class within the same namespace如何替换/覆盖同一命名空间中的类
【发布时间】:2011-11-05 12:04:43
【问题描述】:

基本上,我在我的网站中定义了一个类,其中包含一堆枚举来定义一些常数。每当网站更新到新版本时,它将(并且应该)使用原始类定义。在极少数情况下,我需要覆盖每个网站的这些枚举的值。所以我想我可以将自定义文件放到网站中,用“覆盖”语句重新定义原始类,这样原始文件将始终保持不变,但不会被使用。

但是,当我添加文件时,它当然会抛出错误:“className”已经包含“enumName”的定义。

任何帮助/想法将不胜感激。

例子:

public enum PageIDs
{
    Login = 2,
    SearchResults = 3,
    DocumentsLibrary = 4,
    Error = 5,
    PageNotFound = 6,
    NewsAndEvents = 7
} 

应替换为:

public enum PageIDs
{
    Login = 2,
    SearchResults = 3,
    DocumentsLibrary = 4,
    Error = 9,
    PageNotFound = 15,
    NewsAndEvents = 17
} 

【问题讨论】:

  • 您能否提供一个示例,您希望如何在新版本中更改枚举值?所以只是把旧的枚举和新的枚举
  • 好的,已将其添加到问题中。

标签: c# asp.net .net enums overriding


【解决方案1】:

如果这些值正在改变,您最好将您的应用程序设计为可配置的。您可以使用 web 配置文件或其他配置 xml 或 DB。

【讨论】:

    【解决方案2】:

    使用可被视为“常量”的枚举时,通常不会更改值。

    您的选择是创建一个具有虚拟 int 属性的类,或者加载一些配置文件,如 UnhandledException 所述。

    使用下面的解决方案,您需要实例化类

    public class BasePageIDs {
        public virtual int Login { get { return 2; } }
        public virtual int Search { get { return 3; } }
    }
    
    public class SpecializedPageIDs : BasePageIds {
        public override int Search { get { return 4; } }
    }
    

    如果您想要静态 getter,您将无法创建继承,而是应该从其他地方加载您的 int,例如从上述类的配置中加载。

    public static class PageIDs {
        public static int Login { get { /* load from configuration */ return config; } }
    }
    

    【讨论】:

    • 是的,谢谢,我想我必须将这些设置保存在配置数据库表中。我最初没有,因为一旦部署(在每个网站值上),值就不会改变。谢谢您的帮助。由于 UnhandledException 首先建议,我会将他标记为答案,但您的 cmets 也很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2011-07-16
    相关资源
    最近更新 更多