如何从外部设置文件创建可供其他类使用的字典?

时间:2012-07-23 10:21:21

标签: c# dictionary settings

我想从设置文件创建一个字典,格式化为字符串列表“somekey = somevalue”。然后,我希望由一个类生成的键和值的字典可用于我的程序中的其他类,因此每次我想要使用另一个类中的设置时,我不必返回外部文件。

我已经弄清楚了第一部分,创建了一个可以读取外部文件并将字符串列表转换为字典的类,但我无法弄清楚如何通过文件读取创建字典数据类可用于同一名称空间中的其他类。

3 个答案:

答案 0 :(得分:1)

只需使构成dictoionary public的类和该类中的字典静态,所以

public class MyClass
{
    // ...
    public static Dictionary<string, string> checkSumKeys { get; set; }
    // ...
}

称之为

// ... 
foreach (KeyValuePair<string, string> checkDict in MyClass.checkSumKeys)
    // Do stuff...

或者,如果字典不是静态的,则必须实例化类

public class MyClass
{
    // ...
    public Dictionary<string, string> checkSumKeys { get; set; }
    // ...
}

称之为

MyClass myclass = new MyClass();
foreach (KeyValuePair<string, string> checkDict in myClass.checkSumKeys)
    // Do stuff...

我希望这会有所帮助。

答案 1 :(得分:1)

我不确定你在这里得到什么。你不能简单地将字典作为该类的公共属性吗?

好的一个选项是使用公共属性,然后在初始化应用程序时创建该类的一个实例(如果你将它填充到类构造函数中,这将填充你的字典)然后你可以将同一个实例传入函数或类构造函数,而无需再次读取外部文件。

public class ReadFileClass
{
    //Can be replaced with auto property
    public Dictionary<string, string> Settings
    {
        Get{return Settings}
        Set{Settings = value}
    }

    public ReadFileClass()
    {
        //In this constructor you run the code to populate the dictionary
        ReadFile();
    }

    //Method to populate dictionary
    private void ReadFile()
    {
         //Do Something
         //Settings = result of doing something
    }
}

//First class to run in your application
public class UseFile
{
    private ReadFileClass readFile;

    public UseFile()
    {
        //This instance can now be used elsewhere and passed around
        readFile = new ReadFileClass();
    }

    private void DoSomething()
    {
        //function that takes a readfileclass as a parameter can use without making a new instance internally
        otherfunction(readFileClass);
    }
}

通过执行上述操作,您只需使用一个对象实例来填充设置字典,然后只需传递它。我已多次使用此方法,以避免多次往返数据库或文件,这可能会产生代价高昂的性能影响。如果要使用包含除实例化实例之外的其他文件中的设置的类,只需使类构造函数将其作为参数。

答案 2 :(得分:1)

一种不同的方法是使用扩展方法,我的例子相当基本,但它完美地运作

using System.Collections.Generic;

namespace SettingsDict
{
    class Program
    {
        static void Main(string[] args)
        {
            // call the extension method by adding .Settings();
            //Dictionary<string, string> settings = new Dictionary<string, string>().Settings();

            // Or by using the property in the Constants class
            var mySettings = Constants.settings;
        }
    }

    public class Constants
    {
        public static Dictionary<string, string> settings
        {
            get
            {
                return new Dictionary<string, string>().Settings();
            }
        }
    }


    public static class Extensions
    {
        public static Dictionary<string, string> Settings(this Dictionary<string, string> myDict)
        {
            // Read and split
            string[] settings = System.IO.File.ReadAllLines(@"settings.txt");

            foreach (string line in settings)
            {
                // split on =
                var split = line.Split(new[] { '=' });

                // Break if incorrect lenght
                if (split.Length != 2)
                    continue;

                // add the values to the dictionary
                myDict.Add(split[0].Trim(), split[1].Trim());
            }
            return myDict;
        }
    }
}

settings.txt的内容

setting1=1234567890
setting2=hello
setting3=world

结果

Result

您当然应该使用自己的保护功能和类似功能来扩展它。这是一种替代方法,但使用扩展方法并不是那么糟糕。 Extensions类中的功能也可以直接在Constants类的property方法中实现。我这样做是为了它的乐趣:)