C#命令解析器

时间:2016-09-12 11:40:34

标签: c# parsing console command

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

结构如下: Programm.cs创建了一个Gamecontroller实例。这个Gamecontroller是我想访问的最低级别。它将创建视图的实例,以及来自config等的类。

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

所以我想使用Gamecontroller或任何嵌套对象访问Objects,Member和方法。

目前我无法访问孩子的属性,因为_member返回一个" Type"它被解析为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);
    }

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望将一些字符串命令与您要执行的操作相匹配。在这种情况下,您可以使用Dictionary作为string-delgate couple的存储,以将您的字符串命令与您想要执行的操作相匹配。作为此方法的一个优点,您可以根据需要在程序运行时更改匹配的伴随

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
    }
}