0

我设法从 .ini 文件中写入和读取特定参数。
我想知道是否有办法加载 .ini 文件的全部内容并将其存储在一个特殊的类中。这样,我只需加载 .ini 文件一次。这样,它应该会减少游戏的加载量。

我知道在小型游戏中,这可能无关紧要,但如果有人能指出我正确的方向,我仍然会很感激。

4

2 回答 2

3

我相信 C# 的创建者倾向于将人们推向基于 XML 的配置文件而不是 INI 文件的方向 - 所以没有内置任何东西。我在 CodeProject 上找到了这篇文章,它把东西包装在一个很好的类中。这会有帮助吗?

http://www.codeproject.com/Articles/1966/An-INI-file-handling-class-using-C

我没有写它 - 也没有因此而受到赞扬,但它可能是你正在寻找的 :)

于 2012-12-09T22:20:27.170 回答
1

假设 INI 是一个用新行拆分的简单键/值对,您是否可以使用类似的方法将整个 INI 文件作为字典或强类型对象提供。

该方法允许您将 ini 文件加载到这样的对象中。

class IniStructure
{
    public short Field1;
    public int Property1 { get; set; }
    public string Property2 { get; set; }
}

IniStructure ini = IniLoader.Load<IniStructure>(<fileName>);

或者只是使用非 T 方法进入字典。

public static class IniLoader
    {
        public static T Load<T>(string fileName)
        {
            T results = (T)Activator.CreateInstance(typeof(T));

            PropertyInfo[] tProperties = typeof(T).GetProperties();
            FieldInfo[] tFields = typeof(T).GetFields();

            var iniFile = Load(fileName);

            foreach (var property in tProperties)
                if (iniFile.ContainsKey(property.Name))
                {
                    object s = System.Convert.ChangeType(iniFile[property.Name].ToString(), property.PropertyType);
                    property.SetValue(results, s, null);
                }
            foreach (var field in tFields)
                if (iniFile.ContainsKey(field.Name))
                {
                    object s = System.Convert.ChangeType(iniFile[field.Name].ToString(), field.FieldType);
                    field.SetValue(results, s);
                }

            return results;
        }

        public static Dictionary<string, object> Load(string fileName)
        {
            Dictionary<string, object> results = new Dictionary<string, object>();

            string fileText = File.ReadAllText(fileName);
            string[] fileLines = fileText.Split('\r');
            if (fileLines.Length > 0)
                for (int i = 0; i < fileLines.Length; i++)
                {
                    string line = fileLines[i].Trim();
                    if (!string.IsNullOrEmpty(line))
                    {
                        int equalsLocation = line.IndexOf('=');
                        if (equalsLocation > 0)
                        {
                            string key = line.Substring(0, equalsLocation).Trim();
                            string value = line.Substring(equalsLocation + 1, line.Length - equalsLocation - 1);

                            results.Add(key, value);
                        }
                    }
                }

            return results;
        }
    }
于 2012-12-10T13:17:21.343 回答