这可能是在左派,疯狂,但在我继续实施这一大量课程之前,我只需要问一下。
基本上,我正在编写一个二进制消息解析器,它将某种军事消息格式解码为一个对象。问题在于,实际上有数百种不同的消息类型,它们几乎没有任何共同点。因此,我计划实现这一目标的方法是创建数百个不同的对象。
但是,即使消息属性没有任何共同点,解码它们的方法也相当简单并遵循一种模式。所以我打算编写一个代码生成器来为每种消息类型生成所有对象和解码逻辑。
如果有某种方法可以根据某种模式动态创建对象,那真正令人满意的是什么。它不一定是XML,但XML很容易使用。
这在C#中是否可行?
我希望界面看起来像这样:
var decodedMessage = MessageDecoder.Decode(byteArray);
MessageDecoder确定消息的类型,然后返回适当的对象。它可能会返回一个实现MessageType属性的接口或类似的东西。
基本上我想知道的是,是否有一种方法可以让一个名为Message的对象实现一个MessageType属性。然后,根据MessageType,Message对象将转换为任何类型的消息,因此我不必花时间创建所有这些消息类型。
答案 0 :(得分:3)
ExpandOobject您可以在哪里动态添加字段到对象。
答案 1 :(得分:2)
xsd.exe您要找的是什么?它可以采用XML文件或模式并生成c#类。但是,您可能遇到的一个问题是某些军事信息格式非常钝。你最终可能会得到一些非常大的代码文件。
答案 2 :(得分:1)
看看T4 templates。它们允许您编写代码来生成代码,它们集成到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.