0

.iniファイルから特定のパラメーターを読み書きすることができました。
.iniファイルのコンテンツ全体をロードして特別なクラスに保存する方法があるかどうか疑問に思いました。そうすれば、.iniファイルを1回ロードするだけで済みます。このようにして、ゲームが行う読み込みの量を減らす必要があります。

小さなゲームでは、それは問題ではないことを私は知っていますが、誰かが私を正しい方向に向けることができれば、それでも感謝します。

4

2 に答える 2

3

C#の作成者は、INIファイルではなくXMLベースの構成ファイルの方向に人々をプッシュする傾向があると思います。したがって、何も組み込まれていません。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 に答える