2011-04-27 44 views
0

新的面向对象的方法的做法,只是想知道什么是建议的方法做到这一点。c#类,方法或什么解析配置文件

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

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

所以我现在有一个代码块,目前是类中的一个方法,它包含“main”,并且所有的变量都是全局的。 (不好我知道)。

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

但是,我知道什么:)只是寻找一些想法,所以我不会走得很远,必须回头。

干杯

回答

1

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

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

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

+0

'Global_varible_int tesst = new Global_varible_int(); tesst.parse(); int mul = tesst.multi(10); int numer = tesst.Number; Console.WriteLine(numer); Console.WriteLine(mul);用来测试这一点的代码非常简单,现在类中的“parse”方法就是实现真正解析的方法(只需要在创建实例时解析文件一次,或者手动刷新)。这是做到这一点的最佳方式,还是可以创建一个类的实例并一次性删除方法? – DevilWAH 2011-04-27 22:05:30

+0

好的,你如何在评论中获得新的内容? – DevilWAH 2011-04-27 22:06:24

+0

其有趣的是如何开始这个项目解析文本文件的想法不在我的脑海。但现在这一点的重点是,它将使最终的应用极其灵活,用户友好。我可以使用很少的代码来获得最大的工作量,而牺牲可用性:) – DevilWAH 2011-04-27 22:14:01

1

如果配置文件中的格式不是一成不变的,那么我会建议利用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的家伙,但你的理念。

+0

好主意,但请注意,您将不得不创建一个类来封装所有全局变量(或其他)并将该类名传递给'GetType'。 – 2011-04-27 22:03:12

+0

那里,多数民众赞成 – 2011-04-28 00:03:10

1

为了简单起见,我会使用serializer类来做到这一点:

这里的例子配置类:

[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> 
+0

我喜欢XML的想法,但因为我只在一个文件中阅读,我希望用户能够编辑它们,因为他们认为合适。 XML会有点棘手。 – DevilWAH 2011-04-27 22:07:49

+0

BinaryFormatter代替XmlSerializer类怎么样?它应该以相同的方式工作:http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx – 2011-04-27 22:11:09

1

对于解析,我同意XML序列化是做事情的好方法。

至于如何访问数据一旦它在一个对象中,请考虑static classSingleton pattern

+0

你学到的东西,所以这就是static关键字的作用:)完美!我爱它,因为事情落在地方:) – DevilWAH 2011-04-27 22:25:52

相关问题