2008-10-14 34 views
5

Tôi đã tạo một cách để thêm động SettingsProperty vào tệp .NET app.config. Tất cả đều hoạt động độc đáo, nhưng khi tôi khởi chạy ứng dụng của mình vào lần tiếp theo, tôi chỉ có thể xem các thuộc tính được tạo trong trình thiết kế. Làm cách nào tôi có thể tải lại thời gian chạy thuộc tính?Làm cách nào để tải lại cài đặt được tạo động theo thời gian tiếp theo?

Mã của tôi để tạo SettingsProperty trông giống như sau:

internal void CreateProperty<T>(string propertyName) 
{ 
    string providerName = "LocalFileSettingsProvider"; 
    System.Configuration.SettingsAttributeDictionary attributes = new SettingsAttributeDictionary(); 
    System.Configuration.UserScopedSettingAttribute attr = new UserScopedSettingAttribute(); 

    attributes.Add(attr.TypeId, attr); 

    System.Configuration.SettingsProperty prop; 
    SettingsProvider provider = ApplicationEnvironment.GlobalSettings.Providers[providerName]; 

    prop = new System.Configuration.SettingsProperty(
     propertyName, 
     typeof(T), 
     provider, 
     false, 
     default(T), 
     System.Configuration.SettingsSerializeAs.String, 
     attributes, 
     false, 
     false 
    ); 

    ApplicationEnvironment.GlobalSettings.Properties.Add(prop); 
    ApplicationEnvironment.GlobalSettings.Reload(); 
} 

Khi chạy sau tôi yêu cầu các tài sản thiết lập tôi không thể tìm thấy bất kỳ thuộc tính tạo previosuly. Không có vấn đề gì nếu tôi gọi số ApplicationEnvironment.GlobalSettings.Reload(); hay không.

Trả lời

1

Cài đặt cấu hình do người dùng xác định được gắn với phiên bản lắp ráp mà chúng đã được tạo. Nếu bạn có số phiên bản cán (1.0. . Ví dụ:), Bạn sẽ mất cài đặt từ lần chạy cuối cùng.

1

Tôi gặp phải vấn đề tương tự. IMHO vấn đề là đối tượng .NET System.Configuration.SettingsBase sử dụng sự phản chiếu để xác định tên, loại, v.v. của các thuộc tính cần được tải từ bộ nhớ liên tục. Và khi bạn thêm thuộc tính cài đặt động, thông tin này bị thiếu. Vì vậy, bạn cần phải thêm định nghĩa thuộc tính cài đặt không chỉ trước khi bạn lưu giá trị mà còn trước khi bạn đọc. Trong trường hợp của bạn, nó phải là một cái gì đó như thế này

... 
// the name and type of the property being read must be known at this point 
CreateProperty<T>(propertyName); 
ApplicationEnvironment.GlobalSettings.Reload(); 
T propertyValue = ApplicationEnvironment.GlobalSettings[propertyName]; 

Bạn có thể muốn gọi phương thức CreateProperty ngay từ đầu cho tất cả các thuộc tính bạn muốn sử dụng và sau đó gọi Reload chỉ một lần. Trong cả hai trường hợp, bạn sẽ cần biết tên và loại thuộc tính.

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