4

这可能是左派的出路,很疯狂,但我只需要在继续实施这一庞大的类集之前问一下。

基本上,我正在编写一个二进制消息解析器,它将某种军事消息格式解码为一个对象。问题是实际上有数百种不同的消息类型,它们几乎没有任何共同之处。所以我计划实现它的方式是创建数百个不同的对象。

然而,即使消息属性没有任何共同点,解码它们的方法也相当简单,并且遵循一定的模式。所以我打算编写一个代码生成器来为每种消息类型生成所有对象和解码逻辑。

如果有某种方法可以基于某种模式动态创建对象,那将是非常美妙的。它不一定是 XML,但 XML 很容易使用。

这在 C# 中可能吗?

我希望界面看起来像这样:

var decodedMessage = MessageDecoder.Decode(byteArray);

MessageDecoder 在哪里找出它是什么类型的消息,然后返回适当的对象。它可能会返回一个实现 MessageType 属性或类似的接口。

基本上我想知道是否有一种方法可以让一个名为 Message 的对象实现 MessageType 属性。然后根据 MessageType,Message 对象将转换为任何类型的消息,因此我不必花时间创建所有这些消息类型。

4

3 回答 3

3

ExpandOobject您可以在其中向对象动态添加字段。

一个很好的起点就在这里。

于 2012-03-20T21:04:51.177 回答
2

xsd.exe是您要找的吗它可以采用 XML 文件或模式并生成 c# 类。您可能会遇到的一个问题是某些军事消息格式非常迟钝。您最终可能会得到一些非常大的代码文件。

于 2012-03-20T20:55:13.923 回答
1

查看T4 模板。它们让您编写代码来生成代码,它们被集成到 IDE 中,而且它们真的很容易。

编辑:没有办法做你所追求的var,因为var要求赋值的右侧是静态类型的(在编译时)。我想您可以动态生成该语句,然后编译并运行它,但这是一种非常痛苦的方法。

如果您对所有消息类型都有 XSD,那么您可以xsd.exe按照@jle 的建议使用。如果没有,那么我对以下内容感到好奇:

// Let's assume this works
var decodedMessage = MessageDecoder.Decode(byteArray);
// Now what?  I don't know what properties there are on decodedMessage, so I cant do anything with it.
于 2012-03-20T20:55:32.787 回答