【问题标题】:Building C# setting values on other settings在其他设置上构建 C# 设置值
【发布时间】:2014-07-03 14:21:08
【问题描述】:

我来自 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

如何在 .NET 项目中使用设置和 app.config 文件实现相同的功能?我花了很长时间搜索并没有发现任何有用的东西......

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

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

【问题讨论】:

  • 您在 Java 属性文件中显示的内容不是 java.util.Properties 的固有部分...也许您在它们之上使用了一些东西?
  • @JonSkeet - 是的,在 java.util.Properties 之上使用 XProperties
  • @ThomasLindvall - 提供的链接与我提出的关于建立彼此价值的问题有何关联?
  • 好的,所以当您说“Java 属性文件”时,您的意思是“带有 3rd 方库的 Java 属性”——我怀疑您可以很容易地自己为 app.config 构建一个类似的库。跨度>

标签: c# .net app-config


【解决方案1】:

为我自己的问题提供后续答案...

假设属性文件如下所示:

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

下面的类会将属性文件解析成地图...

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

【讨论】:

【解决方案2】:

我不熟悉从 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多