【问题标题】:Accessing Constants Static Class That References App Settings Config File访问引用应用程序设置配置文件的常量静态类
【发布时间】:2012-05-23 07:53:13
【问题描述】:

我有一个名为 LocalConstants 的类....

 public static class LocalConstants {
    public static string DM_PATH = ConfigurationManager.AppSettings["DMQueue"];
    public static string PROJECT_PATH = ConfigurationManager.AppSettings["MSQueue"];
 }

当我试图在我的主程序中访问这个类时,我得到一个空引用异常。 ConfigurationManager.AppSettings[ 中的任何内容始终为空。但是如果我写

  //The value is returned fine 
  string bo=ConfigurationManager.AppSettings["MSQueue"];

这编译得很好,但总是 null 并抛出一个 NullRefexception

   string moomoo = LocalConstants.PROJECT_PATH;

例外是 'TestCodeOutOnSide.LocalConstants' 的类型初始化程序引发了异常。

innerException 是基本的 对象引用未设置为对象的实例。

即使我将 PROJECT_PATH 更改为

public static readonly string PROJECT_PATH = @"FORMATNAME:DIRECT=OS:serus-nickl\RMQDEV";

我遇到了同样的异常

有什么想法吗?

【问题讨论】:

  • LocalConstants 是否与 app.config 在同一个项目中?
  • 是的,一切都在同一个项目中

标签: c#


【解决方案1】:

首先,如果您这样做是为了提供某种性能优势,那么您应该知道这些是缓存的。请参阅ConfigurationManager.AppSettings Caching,删除任何内容。

第二个问题很可能是Static field initialization 无法按照您的预期工作。因此,您编写的代码不能保证 ConfigurationManager.AppSettings 已经运行。来自链接的文章示例代码:

可能会产生以下输出:

Init A
Init B
1 1

或输出:

Init B
Init A
1 1

[编辑每个 OP 评论]

一定还有其他的东西:

public static class LocalConstants
{
    public static string DM_PATH = "DMQueue";
    public static string PROJECT_PATH = "MSQueue";
}


class Program
{
    static void Main(string[] args)
    {
        string moomoo = LocalConstants.PROJECT_PATH;

        Console.WriteLine(moomoo);
    }
}

为我工作。

[编辑 2 - 来自后来者]

看起来The type initializer for ‘SomeClass’ threw an exception可能是一种情况

但是当它被 WPF 设计器调用时,“应用程序”是 Visual Studio,它(可能)在其 .config 文件中没有适当的连接字符串;

该作者的解决方法是:

将我的实体数据模型的实例化到一个属性中

【讨论】:

  • 有什么更好的解决方法的建议吗?
  • @NickLaMarca 你为什么不喜欢string moomoo = ConfigurationManager.AppSettings["MSQueue"];?你想用你的LocalConstants 类完成什么?
  • 要求代码中没有魔术字符串或 ConfigurationManager 引用。想要全部在 1 个文件中。我只是将 ConfigurationManager 中的所有字符串直接放入 LocalConstants 类中,它仍然抛出异常并返回 null
  • 'TestCodeOutOnSide.LocalConstants' 的类型初始化器抛出异常。
  • @NickLaMarca 这些字符串不是 Magic,它们会命名您正在使用的东西,例如 CONNECTION_STRING,以及您拥有的东西。拥有自己的文件与使用现有的ConfigurationManager 有何不同?而“ConfigurationManager中的字符串直接放到LocalConstants中”是什么意思?
【解决方案2】:

为什么不试试类似的东西:

   public static string ProjectPath 
   { 
       get 
       { 
           return ConfigurationManager.AppSettings["MSQueue"]; 
       } 
   }

【讨论】:

  • 请提供代码sn-p的描述/解释。
【解决方案3】:

我叫这个

public static string Environment = AppEnvironmentVariable.ToUpper() != "PROD" ? "***FROM " + AppEnvironmentVariable.ToUpper() + "** " : "";

在此之前

public static string AppEnvironmentVariable = "DEV";

在 LocalConstants 文件中,由于 Josh 所说的关于静态字段初始化的内容而破坏了它

【讨论】:

    【解决方案4】:

    你可以试试readonly

    public static readonly string PROJECT_PATH = ConfigurationManager.AppSettings["MSQueue"];
    

    readonly 字段可以延迟加载

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多