繁体   English   中英

C#命令解析器

[英]C# Command parser

我目前正在扩展我的知识,并想为自己创建一个小游戏。

结构如下:Programm.cs创建Gamecontroller的实例。 这个Gamecontroller是我要访问的最低级别。 它将从config之类的类中创建视图的实例。

我想用命令输入实现调试控制台。 这些命令应该始终从Gamecontroller级别开始,并且应该能够与我使用C#代码可以做的所有事情进行交互。

所以我想使用Gamecontroller或在任何嵌套对象中访问对象,成员和方法。

当前,我无法获得子级的属性,因为_member返回一个“类型”,该类型将解析为RuntimeProperty而不是Class

解析示例:

"objPlayer.name" > "GameController.objPlayer.name"
"objConfig.someSetting = 10" > "GameController.objConfig.someSetting=10"
"objConfig.functionCall()" > "GameController.objConfig.functionCall()"
"objConfig.objPlayer.setName("someName")" > "GameController.objConfig.objPlayer.setName("someName")"
"objPlayer.name" > "GameController.objPlayer.name"

这是我到目前为止所得到的:

    private void parseComamnd(string Command)
    {
        var actions = Command.Split('.');
        var start = this.GetType();
        var last = actions[actions.Length - 1];
        foreach (var action in actions)
        {
            if (action.Contains("(") && action.Contains(")"))
            {
                _exec(start, action);
            }
            else
            {
                start = _member(start, action);
            }
        }
    }
    private Type _member(Type pHandle, string pStrMember)
    {
        return pHandle.GetProperty(pStrMember).GetType();
    }
    private void _exec(Type pHandle, string pStrFunction)
    {
        var Regex = new Regex(@"\(|,|\)");
        var FunctionParams = Regex.Split(pStrFunction);
        var FunctionName = FunctionParams[0];
        FunctionParams[0] = "";
        FunctionParams = FunctionParams.Where(val => val != "").ToArray();
        pHandle.GetMethod(FunctionName).Invoke(FunctionName, FunctionParams);
    }

如果我理解正确,则希望将某些字符串命令与要执行的动作匹配。 在这种情况下,您可以使用字典作为字符串代表配对的存储,以将字符串命令与要执行的操作进行匹配。 作为这种方法的优势,您可以根据需要在程序运行时更改匹配的对

class SomeClass
{
    delegate void OperationDelegate(string value);
    IDictionary<string, OperationDelegate> Operations = new Dictionary<string, OperationDelegate>();

    public SomeClass()
    {
        Operations.Add("objPlayer.name", SetName);
        Operations.Add("objConfig.someSetting", SetSetting); 
    }

    public void HandleNewValue(string command, string value)
    {
        try
        {
            if (Operations.ContainsKey(command))
                Operations[command](value);
        }
        catch (Exception e)
        {
            Logger.Error(e);
        }
    }

    private void SetName(string value)
    {
        // Some logic there
    }

    private void SetSetting(string value)
    {
        // Some logic there
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM