访问引用应用程序设置配置文件的常量静态类

时间:2012-05-15 18:43:23

标签: c#

我有一个叫做LocalConstants ....的课程。

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

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

  //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";

我得到了同样的例外

有什么想法吗?

4 个答案:

答案 0 :(得分:5)

首先,如果您这样做是为了提供某种性能优势,那么您应该知道这些是缓存的。请参阅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文件中没有相应的连接字符串;

该作者的修正是:

  

将我的实体数据模型的实例化移动到属性

答案 1 :(得分:1)

为什么不尝试这样的事情:

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

答案 2 :(得分:0)

我打电话给这个

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

在此之前

public static string AppEnvironmentVariable = "DEV";

在LocalConstants文件中,由于Josh所说的静态字段初始化

而破坏了它

答案 3 :(得分:-1)

您可以尝试制作readonly

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

readonly字段可以延迟加载