在其他设置上构建C#设置值

时间:2014-07-03 14:21:09

标签: c# .net app-config

我来自Java世界 - 并且Java属性文件可以通过以下方式相互构建...

base.dir=C:\dev\basedir
logging.dir=$(base.dir)\logs  # results in C:\dev\basedir\logs
output.dir=$(base.dir)\output # results in C:\dev\basedir\output

如何使用设置和 app.config 文件在.NET项目中完成相同的操作?我花了很长时间搜索,发现什么都没有用......

app.config 中的以下方法不起作用(返回文字值)...

<setting name="baseDir" serializeAs="String">
   <value>C:\dev\basedir</value>
</setting>
<setting name="logDir" serializeAs="String">
   <value>$(baseDir)log\</value>
</setting>

2 个答案:

答案 0 :(得分:0)

我不熟悉在app.config文件中执行此操作的方法。不过,在程序中编写这样的功能会相当容易。

<setting name="baseDir" serializeAs="String">
   <value>C:\dev\basedir</value>
</setting>
<setting name="logDir" serializeAs="String">
   <value>log\</value>
</setting>

然后,在您的C#中,您可以使用Path帮助程序类将它们组合在一起。 (注意,这是未经测试的,我在内存中编码语法如何为userSettings而不是appSettings工作)。

System.IO.Path.Combine(Properties.Settings.Default.baseDir, 
    Properties.Settings.Default.logDir);

答案 1 :(得分:0)

提供我自己的问题的跟进答案......

假设属性文件如下所示:

## Directories
base.dir=C:\PdfProcessing
archive.dir=${base.dir}\archive
manual.process.dir=${base.dir}\manual_process

以下类将属性文件解析为map ...

static class PropertiesFileReader
{
    private static string PathToPropertiesFile = @"application.properties";
    private static Regex subRegex = new Regex(@"\$\{.*\}");

    /// <summary>
    /// Parses the properties file into a map 
    /// </summary>
    /// <returns></returns>
    public static Dictionary<string, string> ReadProperties() {
        var data = new Dictionary<string, string>();

        foreach (var row in File.ReadAllLines(PathToPropertiesFile))
        {
            var newRow = String.Empty;

            // ignore any rows that are commented out
            // or do not contain an equals sign
            if (!row.StartsWith("#") && row.Contains("="))
            {
                // replace each instance of a variable placeholder in the property value
                foreach (Match match in subRegex.Matches(row))
                {
                    var key = Regex.Replace(match.ToString(), @"[${}]", String.Empty);
                    var replaceValue = data[key];
                    newRow = row.Replace(match.ToString(), replaceValue);
                }

                // add the property key and value
                if (!String.IsNullOrEmpty(newRow))
                {
                    data.Add(newRow.Split('=')[0], string.Join("=", newRow.Split('=').Skip(1).ToArray()));
                }
                else
                {
                    data.Add(row.Split('=')[0], string.Join("=", row.Split('=').Skip(1).ToArray()));
                }
            }


        }


        return data;

    }

}

然后以这种方式给读者打电话......

private static readonly Dictionary<string, string> props = PropertiesFileReader.ReadProperties();

以这种方式访问​​属性值...

props["archive.dir"] # C:\PdfProcessing\archive