我设法从 .ini 文件中写入和读取特定参数。
我想知道是否有办法加载 .ini 文件的全部内容并将其存储在一个特殊的类中。这样,我只需加载 .ini 文件一次。这样,它应该会减少游戏的加载量。
我知道在小型游戏中,这可能无关紧要,但如果有人能指出我正确的方向,我仍然会很感激。
我相信 C# 的创建者倾向于将人们推向基于 XML 的配置文件而不是 INI 文件的方向 - 所以没有内置任何东西。我在 CodeProject 上找到了这篇文章,它把东西包装在一个很好的类中。这会有帮助吗?
http://www.codeproject.com/Articles/1966/An-INI-file-handling-class-using-C
我没有写它 - 也没有因此而受到赞扬,但它可能是你正在寻找的 :)
假设 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;
}
}