我有几个不同的类来表示消息数据(实现ToString()
方法)
DatabaseMessage
Method1Message
Method2Message
然后我有一个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;
//...
}
如何实现这一目标?
希望这是有道理的。
答案 0 :(得分:0)
根据我的理解,你想要的是一个界面,或者扩展一个特定的类。
如果您将Message作为接口创建,则可以定义实现它的任何内容都必须具有特定的方法。
然后为了得到你想要的类型,你可以使用这样的东西:
if (myMessage.GetType() == typeof(DatabaseMessage))
{
DatabaseMessage myDatabaseMessage = (DatabaseMessage)myMessage;
//etc...
}
但是如果您使用了接口,则甚至不需要关心类型,因为无论对象类型如何使用相同的接口,方法都将起作用。
答案 1 :(得分:0)
我不会进入你的设计,为什么你需要这样做。
为了隐式或明确地转换类型,您需要做一些名为Conversion operator overloading的事情。
通过重写这些运算符,您可以只分配不同类型的变量,并且将调用适当的方法进行转换。 (当然,当您要实现的重载方法支持转换类型时)。
public static explicit operator DatabaseMessage (Message m)
{
DatabaseMessage dm = new ...
// conversion stuff
return dm; // return the new DatabaseMessage after conversion
}
希望这会有所帮助。 奥菲尔。
答案 2 :(得分:0)
检查typeof类实例需要您在每次引入新消息类型时更改方法代码 - 违反Open/Close Principle。
我提出了另一种方法,使用对象实例的序列化(XmlSerializer或DatacontractSerializer)作为传输机制,然后使用多态来对消息执行操作。这种方式在包含新消息类型时会引入新类并重写虚方法,因此不会违反Open Close Principle。
所以on serial serialize to Xml,transport和derserialize然后在反序列化的对象上调用peformWorkOnMessage()方法..
那会有用吗?
答案 3 :(得分:0)
好的,看看你对此的看法。
您所说的问题是您不能这样做:
DatabaseMessage db_mess = (DatabaseMessage)m;
...因为m
不是DatabaseMessage
,所以它是Message
。但据我所知,m.data
是一个代表“序列化”DatabaseMessage
的字符串,您可以继续使用其他MessageType.FromString()
类型的Message
模式并执行此操作吗?
DatabaseMessage db_mess = DatabaseMessage.FromString(m.data);
如果问题更多的是如何判断Message
中包含哪种m.data
类型,请与我们联系。