4

我有几个不同的类代表消息数据(实现ToString()方法)

  • DatabaseMessage
  • Method1Message
  • Method2Message
  • ETC...

然后我有一个Message类,它有一个代表发送者的字符串和一个代表关于消息数据类之一的字符串(来自ToString()消息)。我创建了这个类来通过我的通信管道发送消息。

在另一端,我Message从字符串创建一个类并将其发送到一个特定的方法,该方法确切地知道它是哪种消息数据类型。然后我想将整个消息对象转换为能够访问特定消息数据(例如DatabaseMessage类)的东西。

class DatabaseMessage
{
    public string ToString()
    {
        // ...
    }
}

class Message
{
    public string sender;
    public string data;

    public static Message FromString(string message)
    {
        // ...
    }
}

//...

public void Send()
{
    DatabaseMessage db_mess = new DatabaseMessage();

    Message m = new Message();
    m.sender = "me";
    m.data = db_mess.ToString();
}

public void Recieve(string message)
{
    Message m = Message.FromString(message);

    DatabaseMethod(m);
}

public void DatabaseMethod(Message m)
{
    // I want to be able to do this:
    DatabaseMessage db_mess = (DatabaseMessage)m;

    //...
}

一个人将如何实现这一点?

希望这是有道理的。

4

4 回答 4

0

我不会进入你的设计,你为什么需要这样做。

为了隐式或显式转换类型,您需要做一些称为转换运算符重载的事情。

通过覆盖这些运算符,您可以分配不同类型的变量,并调用适当的方法进行转换。(当然,当您将实现的重载方法支持转换类型时)。

    public static explicit operator DatabaseMessage (Message m)  
    {
        DatabaseMessage dm = new ...
        // conversion stuff

        return dm; // return the new DatabaseMessage after conversion
    }

希望这可以帮助。奥菲尔。

于 2012-12-31T12:59:10.980 回答
0

好吧,看看你怎么看这个。

如上所述,您的问题是您不能这样做:

DatabaseMessage db_mess = (DatabaseMessage)m;

...因为m不是 a DatabaseMessage,而是 a Message。但是,据我了解,m.data是一个代表 'serialized' 的字符串DatabaseMessage,那么您可以MessageType.FromString()在其他Message类型中继续您的模式并执行此操作吗?

DatabaseMessage db_mess = DatabaseMessage.FromString(m.data);

如果问题更多是如何判断Message其中包含哪种类型,请m.data告诉我。

于 2012-12-31T13:27:41.057 回答
0

据我了解,您需要的是接口或扩展特定类。

如果将 Message 创建为接口,则可以定义实现它的任何东西都必须具有特定的方法。

然后要获得你想要的类型,你可以使用这样的东西:

if (myMessage.GetType() == typeof(DatabaseMessage))
{
DatabaseMessage myDatabaseMessage = (DatabaseMessage)myMessage;

//etc...

}

但是,如果您使用过接口,您甚至不需要关心类型,因为只要它们使用相同的接口,无论对象类型如何,这些方法都可以工作。

于 2012-12-31T12:44:42.730 回答
0

检查 typeof 类实例将要求您在每次引入新消息类型时更改方法代码 - 违反了打开/关闭原则

我提出了另一种方法,使用对象实例的序列化(XmlSerializer 或 DatacontractSerializer)作为传输机制,然后使用多态性对消息执行操作。这样,当包含一个新的消息类型时,就会引入一个新类并重写虚拟方法,因此不会违反打开关闭原则。

在此处输入图像描述

因此,将序列化发送到 Xml、传输和反序列化,然后在反序列化对象上调用 peformWorkOnMessage() 方法。

那行得通吗?

于 2012-12-31T13:03:52.840 回答