如何通过字符串正确处理自定义命令?

时间:2013-10-25 12:47:30

标签: c# command

为了保持简短:我正在为我正在开发的游戏制作服务器程序。 要控制服务器,我想使用命令。像“/ Server Start 5555”之类的东西。 这些命令以字符串格式发送到服务器。这是我的代码:

ServerCommandsClass ServerCommands = new ServerCommandsClass();
Type Service = typeof(ServerCommandsClass);
MethodInfo method = Service.GetMethod(Signals[Count].MessageArray[0]);

List<object> ObjectList = new List<object>();
for (int i = 1; i < Signals[Count].MessageArray.Length; i++)
{
    ObjectList.Add(Signals[Count].MessageArray[i]);
}

string result = Convert.ToString(method.Invoke(ServerCommands, ObjectList.ToArray()));

它看起来很乱,因为它是......

基本上我得到的是一个存储新消息/命令的类(SignalClass)。首先,我确定消息是否是命令。如果是这样,则运行此代码。我的MessageArray使用string.split函数逐字包含消息。

这很有效,但我觉得这是一种解决方法。

我想要的是一个命令基础设施(有点像在我的世界中),它很容易适应我的需要。就像在我的世界中你可以输入:“/ tp 1000 64 1000”和“/ tp someplayer 1000 64 1000”。在我的作品中你不能因为我的代码的限制。我必须制作一个新方法“tp2”或能够获取额外参数的东西。

我希望有人可以帮我解决这个问题,因为它非常烦人。

b.t.w。我使用.Net 4.5.1来编程。如果我在某个地方有点模糊,请问我,我会澄清。

Dion Dokter

4 个答案:

答案 0 :(得分:0)

当然可以,问题不在于您发布的代码中,而是在您调用的方法中。 你要做的是基本上超载。

/tp x y z

/tp someplaya x y z

与String.Substring(0)和String.Substring(0,5)没有区别。如果你抓住我的漂移。

所以,我想你的方法看起来像这样:

public static void Teleport(params object[])
{
   //here you validate your parameters and take decisions
   //e.g.
   //if(params[0] is String && params[1] is Int32)...
}

答案 1 :(得分:0)

我的两分钱,同意String.Split如果你的分裂字符成为一个命令有点麻烦,所以我说使用XML结构;

<Command>
<CommandName value="">
<Arg1 value="">
<Arg2 value="">etc...
</Command>

另外,根据游戏(连接到同一服务器的多人游戏?)使用多个端口,即使对于同一个客户端,你也可以在游戏中使用多个端口来实现不同的功能(如果游戏足够复杂,可以保证) 。这将有助于您隔离命令逻辑。

但最终,你仍然坚持解析传入的命令,对于游戏棒的调试阶段,使用有意义的字符串名称,在部署之前,你可以将它们减少到相同的几个字节。

至于确定用户text-entry-as-command,像你这样的命令/tp,然后是String.Split,建议强制第一个参数为必需参数,然后是可选参数。在个人说明中,输入的命令应该显示一个参数列表,用户然后“打字”来帮助他们

答案 2 :(得分:0)

我的建议是:不要使用字符串。

如果必须,您可以使用序列化。所以你可以发送任何对象。此外,如果您的问题是关于您希望能够发送不同数量的参数(有点难以猜测您在做什么,请在此处)使用params-keyword

喜欢

public void DoSomething (string command, params string[] paramters) {
// Whatever
}

答案 3 :(得分:0)

我告诉你一种方式,我们在内部完成了这项工作。 我们创建了一个名为RemoteInvoke的js proc。它需要一个命令和一组参数,并将它们发送到服务器。然后,服务器将接受命令并通过以下反射查找方法:

  1. 命名为
  2. 命令
  3. [RemoteInvocable]属性
  4. 公开
  5. 有适当数量的参数匹配。
  6. 原因是当我想要调用某些内容时,我会调用RemoteInvoke,它会将参数发送到服务器。要添加新命令,我可以这样做:

    [RemoteInvocable]
    public void Tp(double x, double y, double z)
    {
        Tp("default", x, y, z);
    }
    
    [RemoteInvocable]
    public void Tp(string location, double x, double y, double z)
    {
       // whatever
    }
    

    关键是命令处理很棘手,但对于所有事情都是一样的 - 只是一堆反射和类型推断,但一旦完成添加一个新命令或具有相同名称和不同参数的多个命令是微不足道的。