2009-11-18 9 views
12

tôi đã cố gắngC# AppSettings: Có một cách dễ dàng để đặt một bộ sưu tập thành <appSetting>

<appSettings > 
    <add key="List" value="1"/> 
    <add key="List" value="2"/> 
    <add key="List" value="3"/> 
    </appSettings > 

System.Configuration.ConfigurationManager.AppSettings.GetValues("List");

Nhưng tôi chỉ nhận được những thành viên cuối cùng. Làm thế nào tôi có thể giải quyết điều này một cách dễ dàng?

+2

giải pháp đơn giản nhất là sử dụng [System.Collections.Specialized.StringCollection] (http://msdn.microsoft.com/en-us/library /system.collections.specialized.stringcollection.aspx): Đã trả lời cho câu hỏi: [Chuỗi chuỗi cửa hàng trong appSettings?] (http://stackoverflow.com/q/10419116/155207) – Serkan

Trả lời

24

Tôi đã xử lý vấn đề tương tự và tôi đã làm điều đó với mã này. Hy vọng điều này sẽ giúp trong vấn đề của bạn.

Trong trường hợp này Danh sách (tương tự như URLSection của tôi) sẽ có một phần cấu hình đầy đủ trong web.config mà bạn có thể nhận được tất cả các giá trị từ phần này sau đó.

<configSections> 
    <section name="URLSection" type="A.WebConfigSection,A,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null"/> 
</configSections> 

<appSettings></appSettings> 

<URLSection> 
    <urlCollection> 
     <add url="1" value="a"/> 
     <add url="2" value="b"/> 
    </urlCollection> 
</URLSection> 

Tôi đã tạo ba lớp cho điều này: ConfigElement, ConfigElementCollection, WebConfigSection.

ConfigElement

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Configuration; 

namespace A 
{ 
    public class ConfigElement:System.Configuration.ConfigurationElement 
{ 
    [ConfigurationProperty("url",IsRequired=true) ] 
    public string url 
    { 
     get 
     { 
      return this["url"] as string; 
     } 
    } 

    [ConfigurationProperty("value", IsRequired = true)] 
    public string value 
    { 
     get 
     { 
      return this["value"] as string; 
     } 
    } 



    } 
} 

ConfigElementCollection

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Configuration; 

namespace A 
{ 
    public class ConfigElementCollection:ConfigurationElementCollection 
{ 
    public ConfigElement this[int index] 
    { 
     get 
     { 
      return base.BaseGet(index) as ConfigElement; 
     } 

    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new ConfigElement(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((ConfigElement)(element)).url; 
    } 
} 
} 

WebConfigSection

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Configuration; 

namespace A 
{ 
public class WebConfigSection:ConfigurationSection 
{ 

    public WebConfigSection() 
    { 

    } 

    [ConfigurationProperty("urlCollection")] 
    public ConfigElementCollection allValues 
    { 
     get 
     { 
      return this["urlCollection"] as ConfigElementCollection; 
     } 
    } 

    public static WebConfigSection GetConfigSection() 
    { 
     return ConfigurationSettings.GetConfig("URLSection") as WebConfigSection; 
    } 
} 
} 
+0

điều rất intersting tôi sẽ thử điều này và có thể yêu cầu trợ giúp nếu tôi không nhận được nó – Markus

+0

Tôi đã thử công việc này nhưng tôi đã nhận được lỗi này: Khi tạo phần cấu hình handler for "URLSection" Đã xảy ra lỗi .: Tệp hoặc tập hợp "A, Ve rsion = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = null 'hoặc một trong số phụ thuộc của nó không được tìm thấy Nhưng tại sao? Tôi chỉ sao chép mã của bạn – Markus

+1

Markus Tôi đã thay đổi tên Không gian tên (A) trong mã này vì nó đại diện cho một số nội dung liên quan đến công ty tôi làm việc. Vì vậy có thể bạn không thể xây dựng mã của mình, nhưng thiết kế này bạn có thể tìm thấy liên kết: http://msdn.microsoft.com/en-us/library/2tw134k3.aspx –

1

Bạn có thể nên tắt thông tin này trong một tệp XML riêng biệt và có tham chiếu đến tệp đó trong AppSettings. Điều đó sẽ giúp bạn linh hoạt hơn nhiều về cách bạn truy xuất thông tin và sử dụng thông tin đó.

Điều duy nhất là bạn muốn tạo một lớp (tĩnh) riêng biệt để đọc XML theo cách tương tự với lớp System.Configuration.ConfigurationManager.AppSettings.

Nếu, mặt khác, HAD nằm trong tệp Web.Config của bạn, tôi đề nghị cách duy nhất để đạt được điều này đơn giản là có một mảng được phân cách bằng dấu phẩy [dấu phẩy/dấu phẩy] Cài đặt "Danh sách".

+0

: S sux, tôi thougth phải có simular cho các bộ sưu tập trong một thẻ app.Config bình thường – Markus

1

Haacked p rovides một cách tiếp cận ngắn gọn để cài đặt cấu hình. Cách tiếp cận của anh ta sử dụng một lớp bắt nguồn từ ConfigurationSection. Vì vậy, ví dụ blog của mình app.config hoặc web.config xml đại diện của bạn sẽ trông như thế này:

<configuration> 
    <configSections> 
    <section name="BlogSettings" type="Fully.Qualified.TypeName.BlogSettings, 
     AssemblyName" /> 
    </configSections> 
    <BlogSettings frontPagePostCount="10" title="You’ve Been Haacked" /> 
</configuration> 

Đây là đáng đọc:

http://haacked.com/archive/2007/03/12/custom-configuration-sections-in-3-easy-steps.aspx

3
foreach (string str in ConfigurationManager.AppSettings.AllKeys) 
    { 
     if (str.ToUpper().IndexOf("SOMESPECIAL") > -1) //the somespecial ones you want to add in 
      lstList.Add(ConfigurationManager.AppSettings[str]); 
    } 
+1

+1 Bit hacky, nhưng đã lưu cho tôi một số thời gian rối tung với phần cấu hình tùy chỉnh cho một ứng dụng đơn giản. –

+2

Điều này chỉ hoạt động nếu các phím là duy nhất, nghĩa là SOMESPECIAL-01, SOMESPECIAL-02, v.v. Nếu bạn chỉ cần lặp lại SOMESPECIAL, bạn chỉ có thể nhận được khóa cuối cùng. –

+0

@PaulGrimshaw Rất thực sự là hacky và cũng có [vấn đề tiếng Thổ Nhĩ Kỳ] (http://haacked.com/archive/2012/07/05/turkish-i-problem-and-why-you-should-care.aspx/). Bạn nên sử dụng quá tải với 'StringComparison' thay thế và [' String.StartsWith'] (https://msdn.microsoft.com/en-us/library/ms131452 (v = vs.110) .aspx) trong khi bạn đang ở đó. – Ronald

2

NinjaSettings thực hiện điều này ra khỏi cái hộp.

Trong quản lý gói giao diện điều khiển

Install-Package NinjaSettings 

Bạn sẽ tuyên bố danh sách của bạn như

<appSettings> 
    <add key="List" value="50,20,10,100"/> 
    </appSettings> 

sau đó tạo ra một giao diện với một bản đồ cho danh sách cho bất kỳ ICollection hoặc mảng

public interface IAppSettings 
{ 
    List<int> List { get; } 
} 

sau đó truy cập cài đặt của bạn sử dụng trình bao bọc NinjaSettings. Nói chung, bạn sẽ dây này bằng cách sử dụng IOC, nhưng việc sử dụng cơ bản là

var settings = new NinjaSettings<IAppSettings>().Settings; 

    int total = 0; 
    for (var i in settings.List) 
    { 
     total+=i;   
    }