道歉,但想不出更好的方式在标题中描述这一点。我也不是真正的开发人员所以请原谅我的字段,变量,对象和方法是否混淆。
无论如何,我有一些C#代码为我的类声明了一个私有变量,它在整个类中都可用。但是在代码中,我实际上决定了它的声明。当我跳转到另一个方法时,由于原始声明,对象/变量的某些功能不可用。
private NetPeer _peer; //initially declared here so it's visible in the entire class
....
public void Initialise()
{
if("some arbitrary validation")
{
_peer = new NetServer(_config); // This is now a NetServer object and not NetPeer, but works fine
}
else
{
_peer = new NetClient(_config); // This is now a NetClient object and not NetPeer, but works fine
}
_peer.Start(); // This works fine as NetClient or NetServer. The method is available to both
}
public void SendIt()
{
_peer.SendToAll(_message); //Now this "SendToAll" is only available with the NetServer and not NetClient. At runtime this fails miserably as you would expect
}
那么有没有办法声明私有的“_peer”变量而不将其定义为NetServer或NetClient直到以后,或者我是否需要重新访问其余代码并使用两个单独的变量运行。
这与问题没有明显的关系,但我使用的是Lidgren库,这是NetServer和NetClient的来源。我想这很容易就是这里引用的任何其他类或方法。
我还删除了很多其他逻辑和代码来展示这个例子。
**编辑:所以我没有意识到要求一般性问题会开始这样的战斗。代码工作正常,我使用了Damien的建议,因为这对我来说是最简单的理解: ((NetServer的)_peer).SendToAll(_message);
感谢所有为我的问题提供积极帮助的人......
答案 0 :(得分:0)
您可以使用接口并从中派生NetServer或NetClient
答案 1 :(得分:0)
你可以这样写:
public void SendIt()
{
var server = _peer as NetServer;
if(_peer == null) throw new InvalidOperationException("SendIt called when we're not the server");
server.SendToAll(_message);
}
同样在其他只适用于某种类型或其他类型的方法中。我本可以省略if(_peer ...
行,但这会留下NullReferenceException
- 我更愿意切换到更有意义的异常类型,同时能够提供一些提示特别是出了问题。
同样地,我本可以做一个直接演员((NetServer)_peer).SendToAll(...
,但这会抛出一个InvalidCastException
,需要更多的挖掘来诊断问题。我更喜欢使用as
并尝试提供尽可能丰富的诊断体验。
答案 2 :(得分:0)
您可以在类中添加两个包装器属性:
private NetServer _peerServer
{
get { return _peer as NetServer; }
}
private NetClient _peerClient
{
get { return _peer as NetClient; }
}
每次使用这两个属性时,都需要进行空检查。例如:
public void SendIt()
{
if(_peerServer == null) throw new InvalidOperationException("_peer is not a NetServer");
_peerServer.SendToAll(_message);
}
但这并不是非常优雅。你真正应该做的是进行一些重构。将类拆分为单独的服务器/客户端相关部分(可能具有基类中的通用功能)将是最干净的选择。
答案 3 :(得分:0)
这取决于您想要或不是您的客户在您点击SendIt()
时也会发送消息。
如果你这样做,你可以这样做:
public void SendIt()
{
if (_peer is NetServer)
(_peer as NetServer).SendToAll(_message);
else
(_peer as NetClient).SendMessage(_message); //as radarbob says it is defined in the Lidgren library, I wouldn't know
}
如果你不这样做,你可以这样做(或遵循Damien的建议):
public void SendIt()
{
if (!(_peer is NetServer)) throw new InvalidOperationException("SendIt called when we're not the server");
(_peer as NetServer).SendToAll(_message);
}
答案 4 :(得分:-2)
NetServer
和NetClient
都继承自NetPeer
。 SendToAll()
中未定义NetPeer
,因此您必须使用SendMessage()
中定义的NetPeer
方法。这适用于任何继承类。
修改强>
问题是它使用的是Lidgren library
。这总是第一个寻找答案的地方。