c#类、方法或解析配置文件的内容

本文关键字:配置文件 方法 | 更新日期: 2023-09-27 17:53:58

新的面向对象的方法做的事情,只是想知道什么是建议的方法来做这件事。

在我的第一个问题中,我问了关于解析文本文件的问题,现在有了一些好的想法(谢谢你们),我开始编写这部分程序。

文本文件有多个部分和需要读入的多个数据类型。这很好,随着文本文件的复杂性的增长,我正在改变代码以适应。但我最终会有30个左右不同的变量/数组/列表等,至少有一些需要是全局可用的程序。

所以我现在有一段代码,目前是类中包含"main"的方法,所有变量都是全局的。(我知道不太好)。

我想一定有一个更整洁的方法来做到这一点,我想使用一个单独的类,创建这个类的实例,并在这个类中调用解析文本和填充变量的方法。然后简单地调用类变量(任何被认为是公共的)从与任何其他类我需要。

但是我知道什么:)只是在寻找一些想法,这样我就不会走得太远,不得不回头。

欢呼

c#类、方法或解析配置文件的内容

你的直觉很好;解析特定类型的文本文件的任务应该封装在一个类中,该类给出了关于从哪里获取数据的一些信息,并生成一个表示解析数据的对象图。就输入而言,带有文件名的字符串是可以的;更好的是,传入一个Stream或StreamReader;同样的解析器可以消化来自文件、内存块或网络传输的信息。

一定要把事情分成可重复的小块;如果一个文件由许多相似的行组成,这些行被解析为子对象,则创建一个方法来解析单行并返回子对象。

也让事情尽可能的单一用途;如果必须处理两种类型的文本文件,请为每种文件类型创建一个类,尽可能使它们实现相同的接口。然后,您可以实现所谓的策略模式,其中一个对象的工作是根据具体情况确定应该使用一系列其他类中的哪个来执行任务。

为了简单起见,我将使用序列化器类来完成:

下面是配置类的示例:

[Serializable]
public class Config
{
    public int ValueOne { get; set; }
    public string ValueTwo { get; set; }
    public int[] LotsOfValues { get; set; }
    public List<FurtherConfig> Other { get; set; }
}
[Serializable]
public class FurtherConfig 
{
    public int Value { get; set; }
}

下面是一些用法示例:

var config = new Config
{
    ValueOne = 23,
    ValueTwo = "Second Value",
    LotsOfValues = new[] { 23, 34, 34 },
    Other = new List<FurtherConfig> {
        new FurtherConfig { Value = 567},
        new FurtherConfig { Value = 98 }
    }
};
var serializer = new XmlSerializer(typeof(Config));
//write out to file
using (var fw = File.OpenWrite("config.xml"))
    serializer.Serialize(fw, config);
//read in from file
Config newConfig;
using (var fr = File.OpenRead("config.xml"))
    newConfig = serializer.Deserialize(fr) as Config;
Console.WriteLine(newConfig.Other[1].Value); //prints 98

这是序列化的输出:

<?xml version="1.0"?>
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ValueOne>23</ValueOne>
  <ValueTwo>Second Value</ValueTwo>
  <LotsOfValues>
    <int>23</int>
    <int>34</int>
    <int>34</int>
  </LotsOfValues>
  <Other>
    <FurtherConfig>
      <Value>567</Value>
    </FurtherConfig>
    <FurtherConfig>
      <Value>98</Value>
    </FurtherConfig>
  </Other>
</Config>

对于解析,我同意XML序列化是一种很好的处理方法。

至于如何访问对象中的数据,可以考虑静态类或单例模式。

如果配置文件的格式不是一成不变的,那么我建议使用System.Xml.XmlSerializer类将配置文件保存/加载为xml。

非常简单的保存…加载将留给您作为练习大小:

using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.something, FileShare.something))
{
    XmlSerializer serializer = new XmlSerializer(this.getType());
    serializer.serialize(file, this);
}

我可能搞错了参数的顺序,而且我是vb程序员,但是你明白我的意思。