首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 自動讀寫設定檔開源元件:XML/INI/Registry 三模式支援

     編輯:關於C#

專案目標

建立一個基類 Configuration,讓開發者只要定義屬性、標註屬性,即可自動完成設定檔的讀取、寫入、型別轉換,支援 XML、INI、Registry 三種格式,且可擴充自訂格式。

架構設計 (三層)

  1. Configuration 基類:封裝 Open/Close、屬性反射、序列化/還原邏輯。
  2. IConfigurationPattern 介面:定義 Load/Save 契約。
  3. 具體 Pattern 實作:XmlPattern、IniPattern、(規劃中) RegistryPattern。

使用範例:XML 模式

[ConfigurationPattern(TPattern.XML)]
public class MyXmlCfg : Configuration
{
    const string PATH = @"\myxmlcfg.xml";
    public MyXmlCfg() : base(PATH) { }

    private string _name;
    private int _randId;

    public string Name { get => _name; set => _name = value; }

    [ConfigurationIgnore] // 不寫入檔案
    [XmlIgnore]
    public int RandId { get => _randId; set => _randId = value; }
}

// 呼叫端
var cfg = new MyXmlCfg();
cfg.Open();                    // 自動讀取
Console.WriteLine(cfg.Name);
cfg.Name = "NewName";
cfg.Close();                   // 自動寫入 (若非 ReadOnly)

使用範例:INI 模式

[ConfigurationPattern(TPattern.INI, "DefaultSection")]
public class MyIniCfg : Configuration
{
    const string PATH = @"\mycfg.ini";
    public MyIniCfg() : base(PATH) { }

    [Section("PrivateInfo")]
    public string Name { get; set; }

    [Section("PrivateInfo")]
    [Key("Age", 18)]           // 指定 Key 名稱與預設值
    public byte Age { get; set; }

    [Section("ClassInfo")]
    [Key("Class")]
    public string ClassName { get; set; }

    [ConfigurationIgnore]
    public int RandId { get; set; }
}

INI 專用屬性:[Section] 指定區段、[Key] 指定鍵名/預設值/大小。

核心流程

  1. Open() → Pattern.Load() → 反射屬性 → 型別轉換 → 賦值欄位。
  2. 屬性變更追蹤 (可選 INotifyPropertyChanged)。
  3. Close() → 若非 ReadOnly → Pattern.Save() → 反射屬性 → 序列化寫入。

擴充自訂格式

  1. 修改 TPattern 列舉加入新模式名稱。
  2. 實作 IConfigurationPattern 介面 (參考 XmlPattern/IniPattern)。
  3. 於 ConfigurationPatternAttribute 對應新模式。

版本規劃

  • V1.0:XML/INI、基類自動化、屬性標註。
  • V1.1:Registry 模式。
  • V1.2:實體類別自動產生工具 (依設定檔反向生成 Code)。

小結

以「慣例優於設定」+ 屬性標註,將設定檔操作封裝於基類,業務碼零樣板碼,專注於領域模型本身。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved