2017-04-18 66 views
0

我只想將某些主要配置存儲在設置文件中,因爲配置可能會隨時更改。 我的應用程序的用戶將能夠在幾個環境中管理一些東西。 每個環境都有自己的配置(基本上是網絡位置的路徑)。C# - 將結構存儲在設置文件中

我爲每個環境構建了一個結構,但是現在我們必須添加更多的環境,因此將源代碼之外的配置存儲起來會很有幫助。

所以,讓我給你一些代碼。我建了兩個結構來描述每個環境:

public struct env_conf 
{ 
    string title; 
    string path_to_xml; 
    string path_to_sharepoint; 
    List<subfolder> subfolders; 
    //Some more strings 

    public env_conf(string title, string path_to_xml, string path_to_sharepoint ...) 
    { 
    //Constructor which is setting the variables 
    } 
} 

public struct subfolder 
{ 
    string folder; 
    bool is_standard; 

    public env_conf(string folder, bool is_standard) 
    { 
    //Constructor which is setting the variables 
    } 
} 

這是環境CONFIGS如何設置:

var finance_conf = new env_conf("MyTitle","MyXMLPath","MySPPath", 
new List<subfolder>{new subfolder("MySubFolder",true);new subfolder("MySubFolder2",false)} 
); 

var sales_conf = new env_conf("MySalesTitle","MySalesXMLPath","MySalesSPPath", 
new List<subfolder>{new subfolder("MySalesSubFolder",true);new subfolder("MySalesSubFolder2",false)} 
); 

這最後一步 - 在配置-實例的定義現在應的內部一個設置文件。

保存string以及string[]在設置文件中對我來說目前爲止沒有問題。但現在我有更多的...

不僅如此,我沒有Visual Studio。我與SharpDevelop合作,迄今爲止這是非常好的。

將我的結構標記爲可序列化沒有幫助。另外,當我手動將設置的類型設置爲MyNamespace.env_conf時,它不會出現在設置設計器中 - 只有「?」出現在類型字段中。 所以現在,我不知道如何繼續。此外,我在互聯網上找到的所有信息似乎都無法幫助我。請幫幫我。

我的XML設置文件是如何編輯的? 我的源代碼是如何編輯的?

問候!

+1

爲什麼你使用結構而不是類?序列化有什麼問題? –

+0

也可能是一個班級,你是對的。由於我只有變量而且沒有函數,所以一個結構體也會這樣做。 不知道爲什麼序列化不起作用,這就是爲什麼我問。 – xola

+0

我也不知道爲什麼你的序列化不起作用 - 因爲*除了設置屬性*之外,你沒有描述你做了什麼。 – grek40

回答

0

我會通過創建可序列化的類來完成它,然後您可以將配置文件反序列化到您的類的實例,並且您將擁有所有設置。

例如,類可能是這樣的:

[Serializable] 
public class EnvironmentConfig 
{ 
    public string Title { get; set; } 
    public string XmlPath { get; set; } 
    public string SharepointPath { get; set; } 
    public List<SubFolder> SubFolders { get; set; } 
    public override string ToString() 
    { 
     return $"{Title}: {XmlPath}, {SharepointPath}, {string.Join(", ", SubFolders.Select(s => s.Folder))}"; 
    } 
} 

[Serializable] 
public class SubFolder 
{ 
    public string Folder { get; set; } 
    public bool IsStandard { get; set; } 
} 

然後在代碼中,您可以創建類的實例,給它一些值,並將其序列化到一個配置文件。稍後,您可以反序列化此文件以加載用戶可能做出的任何更改。

本示例創建一個默認配置並將值顯示到控制檯。然後它給用戶一個修改文件的機會,並顯示新的值。

// Create a default config 
var defaultEnvCfg = new EnvironmentConfig 
{ 
    Title = "USWE Environment", 
    XmlPath = @"\\server\share\xmlfiles", 
    SharepointPath = @"\\server\sites\enterpriseportal\documents", 

    SubFolders = new List<SubFolder> 
    { 
     new SubFolder { Folder = "Folder1", IsStandard = true }, 
     new SubFolder { Folder = "Folder2", IsStandard = false } 
    } 
}; 

// Display original values: 
Console.WriteLine(defaultEnvCfg.ToString()); 

// Serialize the config to a file 
var pathToEnvCfg = @"c:\public\temp\Environment.config"; 
var serializer = new XmlSerializer(defaultEnvCfg.GetType()); 

using (var writer = new XmlTextWriter(
    pathToEnvCfg, Encoding.UTF8) { Formatting = Formatting.Indented }) 
{ 
    serializer.Serialize(writer, defaultEnvCfg); 
} 

// Prompt user to change the file 
Console.Write($"Please modify the file then press [Enter] when done: {pathToEnvCfg}"); 
Console.ReadLine(); 

// Deserialize the modified file and update our object with the new settings 
using (var reader = XmlReader.Create(pathToEnvCfg)) 
{ 
    defaultEnvCfg = (EnvironmentConfig)serializer.Deserialize(reader); 
} 

// Display new values: 
Console.WriteLine(defaultEnvCfg.ToString()); 

Console.Write("\nDone!\nPress any key to exit..."); 
Console.ReadKey();