【发布时间】:2015-11-24 21:12:39
【问题描述】:
这是一个非常琐碎的问题,由于我缺乏经验,看起来很烦人,但是,为什么我不能这样做:
public interface INetworkMessage { ... }
public class NetworkDataMessage : INetworkMessage { ... }
public void ParseMessage (INetworkMessage message)
{
Type concreteMessageType = message.GetType();
var concreteMessageInstance = message as concreteMessageType;
...
// Now in theory I could work with a concrete type?
}
【问题讨论】:
-
你可以,但一般来说你不应该。如果你必须这样做,那么这通常表明你的设计有问题。如果支持类型不是您期望的类型,尝试这样做会带来风险。
-
因为
INetworkMessage不一定是NetworkDataMessage,它可以是它的任何实现,那么你怎么知道要转换成哪个具体类型呢? -
@RonBeyer 但 GetType() 不返回确切的具体类型?
-
@David 再次查看代码,他尝试使用
GetType获取类型,然后使用as将其转换为变量。此代码不会编译。它不是伪代码,concreteMessageType是一个变量。 -
@eYe:一个例子,究竟是什么?您需要考虑系统的架构并确定此方法需要做什么以及它如何适合您的整个系统。如果该方法需要
NetworkDataMessage的实例,则接受该类型的参数。如果它需要INetworkMessage的实例,则接受该类型的参数。您在问题中提出的问题是解决您最初不应该遇到的问题的症状。