我需要一种合理的方法将任意文本文件绘制到C#程序中,并生成任意匿名类型对象,或者可能是某种类型的复合字典。
我有一个代表性的文本文件,如下所示:
adapter 1: LPe11002
Factory IEEE: 10000000 C97A83FC
Non-Volatile WWPN: 10000000 C93D6A8A , WWNN: 20000000 C93D6A8A
adapter 2: LPe11002
Factory IEEE: 10000000 C97A83FD
Non-Volatile WWPN: 10000000 C93D6A8B , WWNN: 20000000 C93D6A8B
有没有办法将此信息转换为匿名类型对象或类似结构?
最终的匿名类型可能看起来像这样,如果它是用C#手工编写的:
new
{
adapter1 = new
{
FactoryIEEE = "10000000 C97A83FC",
Non-VolatileWWPN = "10000000 C93D6A8A",
WWNN = "20000000 C93D6A8A"
}
adapter2 = new
{
FactoryIEEE = "10000000 C97A83FD",
Non-VolatileWWPN = "10000000 C93D6A8B",
WWNN = "20000000 C93D6A8B"
}
}
请注意,由于文本文件的内容是任意的(即密钥可能是任何),因此专用解决方案(例如查找“FactoryIEEE”之类的名称)将无效。但是,文件的结构将始终相同(即组,冒号和逗号的缩进作为分隔符等)。
或者我可能会以错误的方式解决这个问题,你有更好的想法吗?
答案 0 :(得分:4)
你这是错误的方式。您的“匿名类型对象”数据很难构建并且很难使用。要构建它,你必须使用反射技巧。为了什么?
考虑一个PrintReport函数。由于ATO的使用,这个功能不会变得更简单。远离它,它会变得更加复杂和缓慢,不得不使用反射本身迭代键。如果存在少量固定数量的可能密钥,那么您的解决方案可能有意义。然后可能首选使用诸如“obj.FactoryIEEE”的使用语法。
我的方法是使用List<Dictionary<string, string>>
,或者说List<AdapterRecord>
,其中AdapterRecord是
class AdapterRecord
{
public string Name { get; set; }
public Dictionary<string, string> Parameters { get; set; }
}
答案 1 :(得分:4)
查看这篇由两部分组成的文章。它以流畅的方式解析XML文件。它可以适用于解析我认为的文本文件。
它使用C#4动态类型来执行您想要的操作。
答案 2 :(得分:2)
即使在C#4中,似乎也无法做到这一点。
此外,如果您不知道密钥是什么,那么考虑它,那么任何类型的强类型访问都很难,并且简单的分割+插入字典/列表/等等。会更有意义。
答案 3 :(得分:1)
虽然我不喜欢他们,但也许DataTable
会服务......