2012-05-15 21 views
6

Tôi có một lớp được gọi là LocalConstants ....Truy cập hằng tĩnh Lớp Đó Tham khảo App Cài đặt Config file

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

Khi cố gắng truy cập lớp này trong chương trình chính của tôi Tôi nhận được một ngoại lệ tham khảo null. Bất cứ điều gì từ ConfigurationManager.AppSettings [luôn luôn là null. Nhưng nếu tôi viết

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

này biên dịch tốt nhưng luôn luôn là null và ném một NullRefexception

string moomoo = LocalConstants.PROJECT_PATH; 

Trường hợp ngoại lệ là Loại initializer cho 'TestCodeOutOnSide.LocalConstants' ném một ngoại lệ.

Ngoại lệ bên trong là cơ bản Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng.

Thậm chí nếu tôi thay đổi PROJECT_PATH để

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

tôi nhận được cùng một ngoại lệ

Bất kỳ ý tưởng?

+0

Là 'LocalConstants' trong cùng một pr oject như app.config? – IAbstract

+0

Có mọi thứ trong cùng một dự án –

Trả lời

0

tôi gọi này

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

Trước đó

public static string AppEnvironmentVariable = "DEV"; 

Trong tập tin LocalConstants đó đã phá vỡ nó vì những gì Josh nói về khởi lĩnh vực tĩnh

5

Để bắt đầu, nếu bạn đang làm điều này để cung cấp một số loại lợi ích hiệu suất thì bạn nên biết rằng chúng được lưu trữ. Xem ConfigurationManager.AppSettings Caching để xóa bất kỳ.

Vấn đề thứ hai rất có thể là Static field initialization không hoạt động như cách bạn mong đợi. Vì vậy, mã của bạn dưới dạng văn bản cung cấp không đảm bảo rằng ConfigurationManager.AppSettings đã được chạy. Từ bài viết mẫu mã liên kết:

có thể tạo ra một trong hai kết quả:

Init A 
Init B 
1 1 

hoặc đầu ra:

Init B 
Init A 
1 1 

[EDIT mỗi bình luận OP]

Phải có một số thứ khác có liên quan đến:

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); 
    } 
} 

làm việc cho tôi.

[Chỉnh sửa 2 - Fro những người đến sau]

Dường như The type initializer for ‘SomeClass’ threw an exception có thể là một trường hợp

Nhưng khi nó được gọi bởi các nhà thiết kế WPF, các "ứng dụng" là Visual Studio, mà (có lẽ) không có các chuỗi kết nối thích hợp trong nó.tập tin cấu hình;

Việc sửa chữa cho tác giả đó là:

di chuyển instantiation của Entity Data Model của tôi vào một tài sản

+0

Bất kỳ đề xuất nào về cách tiếp cận tốt hơn không? –

+0

@NickLaMarca Tại sao bạn không thích 'string moomoo = ConfigurationManager.AppSettings [" MSQueue "];'? Bạn đang cố gắng làm gì với lớp 'LocalConstants'? –

+0

Yêu cầu không có chuỗi ma thuật hoặc tham chiếu ConfigurationManager trong mã. Muốn tất cả trong 1 tập tin. Tôi đã lấy tất cả các chuỗi trong ConfigurationManager và trực tiếp đặt chúng trong lớp LocalConstants và nó vẫn ném một ngoại lệ và trả về null –

0

Bạn có thể thử làm cho chúng readonly

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

readonly các trường có thể được tải xuống

lười biếng
+0

Đáng tiếc là điều này không hoạt động –

0

Tại sao bạn không thử một cái gì đó như:

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

Vui lòng cung cấp mô tả/giải thích về đoạn mã. –

Các vấn đề liên quan