假设我的程序总是传递一个字符串,表示Wiki语法中的数据表。类似的东西:
{||Client:||ABC|-|Contact:||Joe Smith|-|Current revision:||1.0||}
我不希望每个特定的Wiki表对象(例如,ClientContactTable,CustomerOrderTable等)都知道如何解析|和 - 和}。所以我想编写一大块代码,将字符串解析为一些“中间”层数据对象,我可以将其传递给每个特定Wiki表对象的构造函数。
我的问题是:该中间层对象应该是什么?
答案 0 :(得分:3)
您希望实现System.Runtime.IFormatter
来创建通用的WikiTable序列化格式化程序。为了帮助您解决这个问题,您可以继承System.Runtime.Formatter
基类。
完成后,您可以这样使用它:
Stream msg = GetWikiClientContactTableMessage();
WikiTableFormatter wtf = new WikiTableFormatter(); // nice name ;)
ClientContactTable result = (ClientContactTable)wtf.Deserialize(msg);
此外,如果您更喜欢XmlSerializer并且使调用者将预期的输出类型传递给构造函数,则此代码可能会更容易编写。然后,如果需要,您可以使用反射来获取您期望的属性。
答案 1 :(得分:0)
我会选择从字符串到字符串的地图。
这不是特别OO,但是它会完成这项工作,除非我对这项工作有所了解。
答案 2 :(得分:0)
我会使用Dictionary或Hash表。
http://msdn.microsoft.com/en-us/library/xfhwa508.aspx
如果msdn文档难以阅读(总是适合我),我会给出一个快速概述。 基本上,字典将对象(字符串?)作为键,将另一个对象作为数据。
Dictionary<string,string> d = new Dictionary<string,string>();
d["key1"] = "value";
d["anotherkey"] = "anothervalue";
答案 3 :(得分:0)
正如其他人所说,如果您希望名字作为键,请使用关联映射(string-&gt; string)。那应该是最干净的方式;这意味着您的解析代码可以包含许多输入检查和错误处理,否则将为每个对象类重复。
如果您必须包含多个具有相同名称的条目(例如,同一客户端的多个联系人),您可以回退到(字符串,字符串)对的列表。