2010-03-04 197 views
3

这个问题出现时,我试图找出一个更大的问题,为了简单起见,我省略了。我不得不在C#中表示一个特定的数据结构。它是一个将用于与外部系统进行通信的协议。因此,它具有预定义长度和整数(或其他更复杂的数据)的字符串序列。让我们假设:限制属性的字符串长度

SYSTEM : four chars 
APPLICATION : eight chars 
ID : four-byte integer 

现在,我代表本实施方式将使用字符串,因此

class Message 
{ 
    string System {get; set; };  // four characters only! 
    string Application {get; set; }; // eight chars 
    int Id {get; set; }; 
} 

问题是:我必须确保字符串不具有比预定长度更。此外,这个头部实际上只有十分之一的字段,这些字段会不时变化(我们仍在决定消息布局)。

描述这种结构的最佳方法是什么?例如,我想使用带有数据描述的XML并使用反射来创建一个遵守实现的类(因为我需要以编程方式访问它)。

而且,正如我所说的,还有更多的麻烦。我有其他类型的数据类型,限制字符/数字的数量...

回答

7

对于初学者:整个长度的问题。这很容易通过不使用自动属性来解决,而是声明自己的字段并将属性编写为“老式”方式。然后,您可以在setter中验证您的需求,并抛出异常或丢弃新值(如果它无效)。

对于不断变化的结构:如果无法进入并更改类,则可以编写一个解决方案,该解决方案使用一个Dictionary(也许,每个要存储的数据类型一个)来将名称与值。添加一些描述允许的字段,类型和验证要求的文件(可能是XML)。然而,如果它只是因为你还没有决定最终结构而改变,我可能会更喜欢只是改变类 - 如果你在部署应用程序时不需要这种动态结构,它似乎就像浪费时间一样,因为你最终可能会花更多的时间写出动态的东西,而不是改变课程。

+0

+1这三段描述了我对这个问题的想法,所以我真的很害怕。 – 2010-03-04 21:22:19

+0

Michael,很好的回答,主要是因为它坚持KISS。但是,我希望使用XML将允许非c#编程人员更改数据的描述。由于所付出的努力,我不喜欢改变班级的想法。但也许我只是懒惰。 +1为简单。 – 2010-03-04 21:33:29

+0

@布鲁诺:我不太了解你的具体情况,知道是否有任何要点让他们这样做,但请记住,仅仅改变这个类的定义是不够的。无论如何,您将需要代码来处理这些新的和已更改的字段 - 这需要知道如何加载和存储此类中的内容。此外,由于您认为这是与外部系统进行通信的协议的抽象,那么该系统将如何知道如何处理这些更改? – 2010-03-04 21:46:04